Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;指向类实例的指针 我有一个(C++程序员比我好)简单的类和指针问题。 我曾想过发布示例代码来描述我的问题,但我发现用文字来解释更容易_C++_Pointers - Fatal编程技术网

C++;指向类实例的指针 我有一个(C++程序员比我好)简单的类和指针问题。 我曾想过发布示例代码来描述我的问题,但我发现用文字来解释更容易

C++;指向类实例的指针 我有一个(C++程序员比我好)简单的类和指针问题。 我曾想过发布示例代码来描述我的问题,但我发现用文字来解释更容易,c++,pointers,C++,Pointers,假设我有三门课: 类A:主类-它包含B和C的实例 类B:这个类包含一个输出字符串的方法,称它为Greet() 类C:这个类也有一个方法,但是该方法必须在类a中的B实例中调用Greet()。让我们把它命名为DoSomethingWithB() 于是程序启动了,在主函数中我创建了一个A的实例A再次创建B和C的实例。然后,A调用C.DoSomethingWithB() 我的问题开始了:我无法从C内部访问B 显然,我需要将一个指向B的指针传递给DoSomethingWithB()函数,这样我就可以从

假设我有三门课:

  • 类A:主类-它包含
    B
    C
    的实例
  • 类B:这个类包含一个输出字符串的方法,称它为
    Greet()
  • 类C:这个类也有一个方法,但是该方法必须在类
    a
    中的
    B
    实例中调用
    Greet()
    。让我们把它命名为DoSomethingWithB()
于是程序启动了,在主函数中我创建了一个
A
的实例
A
再次创建
B
C
的实例。然后,A调用
C.DoSomethingWithB()

我的问题开始了:我无法从
C
内部访问
B

显然,我需要将一个指向
B
的指针传递给
DoSomethingWithB()
函数,这样我就可以从
C
内部调用
B.Greet()

长解释,短问题:我该怎么做?

示例代码传入:

#include <iostream>
using namespace std;

class B
{
public:
    void Greet( )
    {
        cout<<"Hello Pointer!"<<endl;
    }
};

class C
{
public:
    void DoSomethingWithB( )
    {
        // ... b.Greet( ); Won't work obviously
    }
};

class A
{
public:
 B b; // Not caring about visibility or bad class/variable names here
 C c;
 void StartTest( )
 {
      c.DoSomethingWithB( );
 }
};

int main( )
{
    A mainInstance;
    mainInstance.StartTest();
}
#包括
使用名称空间std;
B类
{
公众:
无效问候()
{

难道你不简单地把指针或引用传递给对象吗

class C 
{ 
public: 
    void DoSomethingWithB( B& b) 
    { 
        b.Greet( ); // will work fine 
    } 
}; 

class A 
{ 
public: 
 B b; // Not caring about visibility or bad class/variable names here 
 C c; 
 void StartTest( ) 
 { 
      c.DoSomethingWithB( b); 
 } 
};
如果
DoSomethingWithB()
函数不会修改传入的
B
实例,则应标记引用
const
,以便可以使用
const
B对象调用它(例如,如果拥有的
a
对象恰好是
const
):

对于如何将
B
对象传递给函数,您有几个选项:

  • 作为引用(
    void DoSomethingWithB(B&B)
    ),它将允许函数修改传入的对象。更改将在传入的对象中重新选择

  • 作为一个
    const
    引用(
    void DoSomethingWithB(B const&B)
    ),它不允许函数修改传入的对象(除非该常量被丢弃-如果在对象上执行该操作,可能导致未定义的行为,该对象实际上是
    const

  • 作为指向
    B
    对象(
    void-DoSomethingWithB(B*B)
    void-DoSomethingWithB(B-const*pb)
    )的指针或
    const
    指针。它们的性能与通过引用传递类似,但函数可以传递一个空指针,需要正确处理(在这种情况下不取消对它的引用)。此外,函数的调用需要稍微更改以传递
    B
    对象的地址:

    c.DoSomethingWithB( &b);
    
  • 作为传递值参数(
    void DoSomethingWithB(B)
    )。这有一个区别,即函数可以对传入的对象执行它喜欢的任何操作,并且不会影响最初传递的对象,因为函数正在处理副本。缺点是传递参数会导致生成副本,这可能会很昂贵。您也可以传入
    const
    值,但存在以下问题:tle建议通过一个
    const
    参考


请注意,在选择参数传递方法时,应首先根据需要函数执行(或不执行)的语义进行选择。以后再考虑效率。始终首先考虑设计和代码的正确性-只有在设计和代码正确后才考虑效率。

您可以按照您所说的那样做-将指针(或引用)传递到B中的
DoSomethingWithB()

然后您将像这样调用它:

class A
{
public:
    B b; // Not caring about visibility or bad class/variable names here
    C c;
    void StartTest( )
    {
        c.DoSomethingWithB( b );
    }
};
我建议在这里使用参考方法,而不是指针,因为:

  • 您的对象是自动类成员,并且
  • 在这种情况下,将null B对象传递到函数中没有意义

  • 将功能更改为以下内容:

    void DoSomethingWithB(B& b)
    {
        b.Greet();
    }
    
    …在一个

    c.DoSomethingWithB(b);
    

    在类C中,声明方法
    DoSomethingWithB(
    ),如下所示:

    void DoSomethingWithB( B* b )
    {
       b->Greet();
    }
    
    void StartTest()
    {
        c.DoSomethingWithB( &b );
    }
    
    在A班,你可以这样称呼它:

    void DoSomethingWithB( B* b )
    {
       b->Greet();
    }
    
    void StartTest()
    {
        c.DoSomethingWithB( &b );
    }
    

    自从你提到指针后,我用指针来回答。但是在C++中,你应该尽量使用<代码> const 引用。当然,这需要对现有代码进行一个小的改动:

    void DoSomethingWithB( const B& b )
    {
       b.Greet();
    }
    
    // and
    
    void StartTest()
    {
        c.DoSomethingWithB( b );
    }
    
    我无法从C内部访问B

    与其在B中使用C调用方法,为什么不让C向调用者返回信息以便它可以执行操作


    当我点击这些按钮时,我发现这是因为我的课程组织得很差。通常,如果我重新思考它们,困难就会随着新的组织而消失。

    这就是我所寻找的,我还不太熟悉指针。这是最有效的方法吗?我还想在这里提到const reference,只是为了说明这个选项。我不确定我是否错了唱点什么,因为你的问题包含了一些关于课堂使用和可视性的知识;这个答案似乎太简单了。但每个人都需要从一开始就学习;这个问题似乎表明可能还有更多。@Nikolai-我没有提到
    const
    ,因为不清楚
    DoSomethingWithB()
    函数将修改
    B
    实例。不过,我要补充一点。@lamas-指针和引用非常有效。举个简短的例子,我倾向于使用引用,因为没有明显的理由必须处理空指针。指针和引用之间没有真正的效率差异。通常,引用比传递值更有效,传递值必须复制参数。
    void DoSomethingWithB( const B& b )
    {
       b.Greet();
    }
    
    // and
    
    void StartTest()
    {
        c.DoSomethingWithB( b );
    }