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
。让我们把它命名为DoSomethingWithB()Greet()
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 );
}