【问题标题】:C++: Passing classes as argument to methods of other classesC++:将类作为参数传递给其他类的方法
【发布时间】:2013-09-10 15:32:21
【问题描述】:

我想将一个类指针传递给一个函数,该函数是另一个类的成员,但它不起作用。如果函数fill_packet不是任何类的成员,则代码编译没有问题:

// WORKS FINE:

class Packet{
private:
  char *contents;

public:
  void pack();
};

void fill_packet(Packet *a){
  a->pack();
};

但是,如果函数 fill_packet 位于另一个类(此处为 Worker)中,则当我尝试访问 a 的方法时,它突然不再编译。

// WON'T COMPILE:
// error: ‘Packet’ has not been declared

class Worker{
public:
  void fill_packet(Packet *a){
    a->pack();
  };
};

class Packet{
private:
  char *contents;

public:
  void pack();
};

谁能给我一些见解?提前致谢

【问题讨论】:

  • 您在此处发布的内容很好。一定是有其他问题。
  • 添加更多信息。你在哪里调用fill_packet?您是在使用有效包装的有效工人调用它吗?尝试编译时收到什么错误消息?
  • 听起来像 fill_packet 可能想要是静态的。那么它也应该可以工作。
  • 不要使用指针传递引用,使用引用

标签: c++ function class arguments


【解决方案1】:

在声明“数据包”之前,可能会在其他地方包含 Worker。要解决此问题,您可以在声明“Worker”时告诉编译器 Packed 类存在,并且需要将“fill_packet”的实现放在声明两个类的位置;

类似这样的:

class Packet;
class Worker{
public:
  void fill_packet(Packet *a);
};

//in a cpp file:
void Worker::fill_packet(Packet *a){
    a->pack();
};

希望这会有所帮助, 拉克斯万。

【讨论】:

  • 也许#include这个cpp文件中定义Packet的头文件?
  • 是的,在定义了两个类的地方,如果在 cpp 中,则 cpp 需要包含两个声明。
  • 谢谢,这对我有帮助!
【解决方案2】:

确保Packet类是在Worker类之前定义的,这里是一个完整的测试:

#include <iostream>

class Packet {
private:
    char *contents;

public:
    void pack() {
        this->contents = "Some text";
    }
    char * getContents() {
        return this->contents;
    }
};

class Worker {
public:
    void fill_packet(Packet *a) {
        a->pack();
    }
};


int main() {
    Packet * packet =  new Packet;
    Worker worker;
    worker.fill_packet(packet);

    std::cout << packet->getContents() << std::endl;

    delete packet;
    return 0;
}

如果你运行这个测试,你会得到你期望的输出。

【讨论】:

  • 我认为声明的顺序无关紧要,只要两者都在同一区域中声明即可。这对我帮助很大,谢谢!
  • 哦,我现在明白了。这是使用标头的目的之一。如果我在头文件中定义类和函数的原型并将它们包含在 cpp 文件的开头,在本例中为 main.cpp,则声明的顺序无关紧要,因为所有名称都是已知的。
【解决方案3】:

是的,它确实可以编译!

也许你在一个你没有包含的标题中定义了这个类?

【讨论】:

  • 我认为这不是答案,而是评论
  • 哦,你是完全正确的。我在之前的尝试中定义了一个标题并忘记了它。如果可以的话,我会接受你的第二个答案......
【解决方案4】:

如果你的代码是这样的

Packet mPacket;
Worker mWorker;
mWorker.fill_packet(&mPacket);

这应该可以。

另一方面

Worker.fill_packet(&mPacket);

除非你声明

class Worker{
public:
  static void fill_packet(Packet *a){
    a->pack();
  };
};

编辑:请注意,编译器错误从您发布的代码 sn-p 中没有意义。

【讨论】:

  • 是的,这对我来说也没有意义。 Grim 和 Rawdan 的回答为我解决了这个问题。我认为这个特殊错误来自我忘记更新的标题。
猜你喜欢
  • 2015-10-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-05
  • 2016-09-30
  • 1970-01-01
  • 2015-12-26
  • 2016-12-31
  • 1970-01-01
相关资源
最近更新 更多