【问题标题】:'Undefined reference to Class::method()''对 Class::method() 的未定义引用'
【发布时间】:2012-07-29 02:04:18
【问题描述】:

最近我一直在学习如何在类中创建方法,这样我只需编写一次方法,对于我实例化的每个类,我都可以调用一个方法,它只适用于对象的变量调用它,我知道如何在仅使用 main.cpp 而没有头文件时执行此操作,但是当我使用类头文件和 cpp 时,我对如何编写它感到困惑。
我有一个类似于我想要实现的代码示例:

#include <iostream>

using namespace::std;

class Object
{
public:
    int stuff;
    void manageStuff();
    Object();
};
void Object::manageStuff()
{
    stuff++;
}

Object::Object() : stuff(0) {}

Object object1, object2;

int main() {
  for (int i = 0; i < 10; i++)
  {
      object1.manageStuff();
      object2.manageStuff();
      cout << object1.stuff << "\n";
      cout << object2.stuff << "\n";
  }
}  

这很好用,允许我有两个 Object 实例和一个为每个实例独立工作的方法,这是我当前的项目:
main.cpp:

#include <iostream>
#include "Test.h"

using namespace std;

int main()
{

    Test test;

    for (int i = 0; i < 10; i++)
    {
        test.count(); // Here's my error "undefined reference to Test::count"
    }

    return 0;
}  

测试.cpp

#include <iostream>
#include "Test.h"

using namespace std;

Test::Test()
{
    //ctor
}

Test::~Test()
{
    //dtor
}  

测试.h

#include <iostream>

#ifndef TEST_H
#define TEST_H


class Test
{
    public:
        Test();
        virtual ~Test();
        void count();
        int counter();
};

#endif // TEST_H  

最后是 TestFunctions.h

#include <iostream>
#include "Test.h"

#ifndef TESTFUNCTIONS_H_INCLUDED
#define TESTFUNCTIONS_H_INCLUDED

void Test::count()
{
    Test::counter++;
    std::cout << Test::counter;
}

#endif // TESTFUNCTIONS_H_INCLUDED  

我敢肯定,对于经验更丰富的程序员来说,会有一些非常明显的错误,我看起来有点厚,但任何帮助将不胜感激
谢谢!

【问题讨论】:

  • 代码看起来不错。错误可能在于您尝试将其链接以形成可执行文件的方式。
  • 这个问题太冗长了,我认为这是一个小问题(而且有数百个重复项)。请把它浓缩成一个小的、独立的例子。不要告诉我们什么有效,只要告诉我们问题所在,并给问题一个更相关的标题。
  • 您的变量 test 从未在 main.cpp 中初始化。

标签: c++ class methods header instance


【解决方案1】:

我建议去掉TestFunctions.h,并将Test::count() 的实现添加到Test.cpp。目前,TestFunctions.h 标头未包含在任何地方,因此您无法从 main 访问定义。

【讨论】:

  • 谢谢!我把它放在 Test.cpp 中,但是现在我得到一个新错误:Test::counter++; \\"error: no post-increment operator for type" 有什么想法吗?我在网上找到了好坏参半的结果,有人说这与使用模板而不是类有关,其他人说使用像 VC++ 这样的其他编译器会有所帮助
  • @TotalJargon 问题是Test::counter 是一个函数,你不能增加它。您没有任何要增加的数据。目前尚不清楚您要做什么,但代码看起来肯定是错误的。这超出了这个问题的范围:)
  • count 是 Test 类中的 void 类型,counter 是 int 类型,仍然不知道为什么这不起作用?
  • @TotalJargon 因为`int counter();`声明了一个返回int的函数。如果你想要一个 int 数据成员,那么你需要在构造函数中使用 `int counter;. And you should initialize it to 0`。
  • like: Test::Test() { //ctor counter(0); } ?
【解决方案2】:

您在头文件 (TestFunctions.h) 中定义(即实现)Test::count(),但您从未将它包含在任何地方,因此没有编译那里的代码。

您应该将其更改为 .cpp 文件,对其进行编译并将其与其他源文件链接。没有理由不将它放在 Test.cpp 中。

【讨论】:

    【解决方案3】:

    将TestFunctions.h重命名为TestFunctions.cpp,使其编译方式与main.cpp相同并链接。

    或者,在某处包含 TestFunctions.h,例如main.cpp

    【讨论】:

      猜你喜欢
      • 2013-01-19
      • 2015-07-10
      • 2011-03-31
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多