C++指向类实例的指针

lam*_*mas 4 c++ pointers

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

假设我有三个班:

  • A类:主类-它包含的两个实例BC.
  • B类:这个类包含一个输出一些字符串的方法,调用它Greet().
  • C类:这个方法也有一个方法,但该方法必须调用位于类Greet()中的实例.我们来命名吧BADoSomethingWithB()

所以程序启动,在main函数中我创建了一个实例A.A再次,创建B和的实例C.然后,A打电话C.DoSomethingWithB();.

我的问题就出现了:我无法B从内部访问C.

很显然,我需要一个指针传递给BDoSomethingWithB()函数,这样我可以调用B.Greet()从内C

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

示例代码传入:

#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();
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*urr 8

难道你不是简单地将指针或引用传递给他的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); 
 } 
};
Run Code Online (Sandbox Code Playgroud)

如果DoSomethingWithB()函数不会修改传入的B实例,则应该标记引用,const以便可以使用constB对象调用它(例如,如果拥有A对象恰好是const):

void DoSomethingWithB( B const& b);
Run Code Online (Sandbox Code Playgroud)

您有几个选项可以将B对象传递给函数:

  • 作为reference(void DoSomethingWithB( B& b)),它将让函数修改传入的对象.将在传入的对象中重新进行更改.

  • 作为constreference(void DoSomethingWithB( B const& b)),它不会让函数修改传入的对象(除非constness被抛弃 - 如果在对象上完成,可能会导致未定义的行为const)

  • 作为指向对象(或)的指针或const指针.它们具有与通过引用传递类似的性能,但该函数可以传递一个NULL指针,需要正确处理(在这种情况下不通过解除引用).此外,函数的调用需要稍微改变以传递对象的地址:Bvoid DoSomethingWithB( B* b)void DoSomethingWithB( B const* pb)B

    c.DoSomethingWithB( &b);
    
    Run Code Online (Sandbox Code Playgroud)
  • 作为pass-by-value参数(void DoSomethingWithB( B b)).这有点不同,函数可以对传入的对象执行任何它喜欢的操作,并且它不会影响最初传递的对象,因为函数正在处理副本.缺点是传递参数导致复制可能是昂贵的.你也可以传入一个const值,但没有什么可以推荐传递一个const引用.

请注意,在选择参数传递方法时,您应该首先根据您需要该功能执行(或不执行)操作的语义进行选择.以后担心效率.始终首先设计并编写正确的代码 - 只有在设计和代码正确后才能担心效率.

  • 我在这里也提到**const**引用,只是为了显示该选项. (2认同)