C ++指向类实例的指针

时间:2010-02-16 17:12:20

标签: c++ pointers

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

假设我有三个班级:

  • A类:主要类 - 它包含BC的实例。
  • B类:此类包含一个输出字符串的方法,称之为Greet()
  • C类:此方法也有方法,但该方法必须在Greet()B的实例中调用A 。我们将其命名为DoSomethingWithB()

所以程序启动,在main函数中我创建了A的实例。 A再次创建BC的实例。然后,A调用C.DoSomethingWithB();

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

显然,我需要将B的指针传递给DoSomethingWithB()函数,以便我可以从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();
}

6 个答案:

答案 0 :(得分: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); 
 } 
};

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

void DoSomethingWithB( B const& b);

您可以选择如何将B对象传递给函数:

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

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

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

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

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

答案 1 :(得分:3)

将功能更改为以下内容:

void DoSomethingWithB(B& b)
{
    b.Greet();
}

......并在A ...

c.DoSomethingWithB(b);

答案 2 :(得分:2)

你可以像你说的那样做 - 将指针(或引用)传递给B到DoSomethingWithB()

class C
{
public:
    void DoSomethingWithB(B & bInstance)
    {
        bInstance.Greet( ); // should work fine!
    }
};

然后你会像这样调用它:

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

我建议在这里使用参考方法而不是指针,因为:

  1. 您的对象是自动类成员,
  2. 在这种情况下,将空B对象传递给函数是没有意义的。

答案 3 :(得分:0)

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

void DoSomethingWithB( B* b )
{
   b->Greet();
}

在A班中称之为:

void StartTest()
{
    c.DoSomethingWithB( &b );
}

既然你提到了指针,我回答了使用指针。但是,在C ++中,您应尽可能尝试使用const引用。这当然需要对现有代码进行一些小改动:

void DoSomethingWithB( const B& b )
{
   b.Greet();
}

// and

void StartTest()
{
    c.DoSomethingWithB( b );
}

答案 4 :(得分:0)

  

我无法从C内部访问B

不是在B中使用C调用方法,为什么不将C返回给调用者的信息,以便它可以执行操作?

当我点击这些时,我发现这是因为我的课程组织得不好。通常,如果我重新考虑它们,那么新的组织就会消失。

答案 5 :(得分:-1)

class C 
{ 
public: 
    C (B & b) : b(b) {}
    void DoSomethingWithB( ) 
    { 
        // ... b.Greet( ); Use b;
    } 
private:
    B & b;
}; 

class A 
{ 
public: 
 B b; // Declare b before c! 
 C c; 
 A() : c (b) {}
 void StartTest( ) 
 { 
      c.DoSomethingWithB( ); 
 } 
};