【问题标题】:Initialize Members (whose constructors accept arguments) in a struct in a class在类的结构中初始化成员(其构造函数接受参数)
【发布时间】:2011-06-15 23:09:06
【问题描述】:

当我尝试使用这种通用格式的代码时,我收到来自编译器的错误:

在类名.hpp中

#include "otherclass.hpp"
class classname {
public:
    typedef struct {
        otherclass membername(sometype);
    } structname;
    void functionname(structname& exampleData);
}

在main.cpp中,我定义了一个变量exampleData:

classname::structname exampleData;

在 classname.cpp 中,我有一个使用 exampleData 并尝试初始化结构的成员 membername 的函数:

void classname::functionname(structname& exampleData){
    sometype a;
    exampleData.membername(a);
}

我从我的编译器收到一条错误消息:

未定义符号:classname::structname::membername(sometype)" 引用自 classname.o 中的 classname::functionname(classname::structname&)。ld:未找到符号

我认为我的错误在这条线之内

otherclass membername(sometype)

我也认为可能是:

otherclass membername(sometype& a)

但我收到了同样的错误。

我想知道这样做是否合法,在构造函数不是 () 的类的结构中拥有一个成员。在 main.cpp 中,当我声明 exampleData 时,membername 尚未初始化。这是合法的还是我在错误的地方打猎?

【问题讨论】:

  • 您的代码不可能是正确的,缺少大量分号。修复代码并再次检查。此外,您的函数 functionname 只是 hpp 文件中的全局(免费)函数,而不是成员函数。
  • -1 未发布真实代码(例如,发布的代码缺少分号)。我们不是心灵感应者。我投票结束,因为这不是一个真正的问题。
  • -1 表示未发布导致错误的编译器命令。如果是链接器错误,我们应该能够验证您是否已将所有相关模块链接在一起。
  • 你为什么要typedef struct {...} structname;?它不是 C,请学习正确的 C++。只需写struct structname{...};
  • @PawelZubrycki 如果它在 C++ 中编译,那么它正确的 C++。

标签: c++ class struct initialization


【解决方案1】:

您遇到的错误看起来很像函数classname::structname::membername 未在任何地方定义导致的链接器错误。从您发布的代码来看,您似乎只是声明了函数而没有在任何地方提供定义,这意味着代码将编译但不会链接。您应该能够通过在程序中的某处提供该函数的实现来解决此问题。与参数是否通过引用获取无关;在这两种情况下,您仍然需要提供一个实现。

【讨论】:

  • 我还不清楚。提供定义(除了 class.cpp 文件中的函数?)或在我的程序的其他地方提供实现函数名是什么意思?谢谢
  • classname 内部的嵌套结构structname 中,您已经创建了一个名为membername 的函数原型。但是,您没有在任何地方提供该函数的实现,这意味着如果您调用该函数,链接器将无法生成有效的程序,因为它找不到该函数时应该执行的代码叫做。实现此功能将解决此问题。
  • 这个答案完全正确,你的编译器也是如此:你没有定义classname::structname::membername(顺便问一下,你到底是从哪里想出那些可怕的名字的?每个人都知道一个类被称为Foo ;-) )。说 otherclass membername(sometype) { return otherclass; } 或类似的东西来提供骨架定义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-02
  • 2020-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多