0

我定义了两个类class Aclass B。他们是完全独立的。

现在我创建c为实例class Bd实例class A。现在我想定义functionOfA将执行操作的主体c

class A {
public:
    functionOfA();
}

class B {
    ...
}

A::functionOFA()
{
    c.functionOfB();
}

main()
{
    A d;
    B c;
    d.functionOfA();
}

但编译器给了我以下错误:c is not declared in this scope

4

5 回答 5

2

A::functionOfA()定义需要知道什么是c实例,你可以传入B实例:

class B;

class A
{
public:
    functionOfA(const B& b) const;
};

A::functionOFA(const B& b) const
{
    b.functionOfB();
}

A a;
B b;
a.functionOfA(b); // pass in B instance
于 2013-09-15T05:39:50.043 回答
1

在此代码(您的main)中:

{
    A a;
    B b;
    a.functionOfA();
}

b是仅在此范围内可用的局部变量。b表示具有自动存储持续时间的对象,直到执行超出范围(在本例中:超出您的范围main)。

当您调用方法functionOfA时,虽然对象b仍然“存在”,但functionOfA无法访问此对象~>此方法需要引用此对象(或其副本)才能使用它:

class A {
public:
    void functionOfA(B& b) {
        /* b is now accessible here, this method can also change the object b */
    }

以这种方式调用:

A a;
B b;
a.functionOfA(b);

我建议您也看看这些问题:
如何将对象传递给 C++ 中的函数?
在 C++ 中通过值传递还是通过常量引用传递更好?
在 C++ 中通过指针传递比通过引用传递有好处吗?

一些好书在这里也可能很有帮助:
权威的 C++ 书籍指南和列表

于 2013-09-15T05:54:32.723 回答
0

您收到此错误的原因是 A 类的任何对象都无法访问 c。要更改此设置,您可以执行以下两种操作之一:您可以给 A 一个 B 类型的数据成员并使用它,或者传入一个对象类型 B 到 A 的功能。

class A {
public:
    B objB;
    functionOfA();
}

class B {
    ...
}

A::functionOFA()
{
    objB.functionOfB();
}

main()
{
    A d;
    B c;
    d.objB = c;
    d.functionOfA();
}

或(保持它们独立)

class A {
public:
    functionOfA(B& objB);
}

class B {
    ...
}

A::functionOFA(B& objB)
{
    objB.functionOfB();
}

main()
{
    A d;
    B c;
    d.functionOfA(c);
}

查看依赖注入。我认为您可以使用该技术在第一个场景中使 A 与 B 的类型无关。

于 2013-09-15T14:54:12.880 回答
0
A::functionOFA()
{
    c.functionOfB();  //You cannot do this unless c is global
}

但是在你的情况下main

利用:

 B c;
void A::functionOfA()
{
    c.functionOfB();
}

或者

将 B 的对象作为参数传递functionOfA(const B& c)

于 2013-09-15T05:37:54.490 回答
0

我不明白如果另一个调用方法的 1 个调用方法,它们是如何完全独立的。c但是您可以作为参数传递。

class B
{public:
    functionOfB();
}

class A
{public:
    functionOfA(B /*or B& or const B&, learn about references*/ c);
    .....;
}



A::functionOFA(B c)
{
    c.functionOfB();
}

B::functionOfB()
{
  .....
}

main()
{
    A d;
    B c;
    d.functionOfA(c);
}
于 2013-09-15T05:39:10.157 回答