C ++类重新定义错误 - 我无法想象我的生活

时间:2015-11-02 11:19:49

标签: c++

我为何获得'C2011 'Transaction':'class' type redefinition的任何帮助?我确定它显而易见,但我不能为我的生活弄明白。请帮忙。

transaction.h

#include <string>

class Transaction
{
private:
    int amount;
    std::string type;

public:
    Transaction(int amt, std::string kind);
    std::string Report();
};

transaction.cpp

#include "transaction.h"

using namespace std;

Transaction::Transaction(int amt, std::string kind):amount(amt), type(kind)
{
}

string Transaction::Report()
{
    string report;
    report += "  ";
    report += type;
    report += " ";
    report += to_string(amount);

    return report;
}

3 个答案:

答案 0 :(得分:5)

您可以在头文件中使用标头保护,这将确保您永远不会在任何其他cpp文件中定义类或结构等。

要添加标题保护,您只需执行此操作:

#ifndef TRANSACTION_H
#define TRANSACTION_H
// your header file
#endif

或者只需添加

#pragma once

到你的所有标题文件,你很好。

答案 1 :(得分:1)

您需要在transaction.h中使用包含警卫

#if !defined(your_symbol)
#define your_symbol 1
/*ToDo - code here*/
#endif

其中,your_symbol通常是对文件名称的修饰。注意不要使用前导双下划线或单个前导下划线,后跟大写字母,因为它们是保留符号。

这可以防止类声明在任何编译单元中被包含多次。

您可以使用#ifndef your_symbol代替我的第一行,并从第二行删除1,或者甚至只使用文件顶部的#pragma once指令,但版本I现在适用于我遇到的每一个编译器。

答案 2 :(得分:0)

在标题中试试这个:

#ifndef TRANSACTION  //If transaction has never been defined before
#define TRANSACTION  //Define transaction
//Content of your header
#endif

这个头球卫士可能会帮到你。实际上,它会阻止您的标题被多次包含,从而导致重新定义。如果你在不需要这些警卫的情况下包括你的标题,但无论如何都不会有任何伤害。

或者,您可以在标题的开头使用#pragma once

如果您想了解更多相关信息,请查看wikipedia