我为何获得'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;
}
答案 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