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

C++ Class redefinition error - I cannot figure this out for the life in me

本文关键字:我的生活 错误 新定义 定义 C++      更新时间:2023-10-16

关于我为什么要获得'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;
}

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

要添加标头保护,您可以简单地执行以下操作:

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

或者简单地添加

#pragma once

所有的头文件,你很好。

您需要在transaction.h:中使用include guards

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

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

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

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

在标题中尝试以下操作:

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

这个头球后卫可能会帮助你。事实上,这将防止您的标头被多次包含,从而导致重新定义。如果你只包括一次你的头球,你就不需要这些后卫,但无论如何,有他们也没什么坏处。

或者,您可以在页眉的开头使用#pragma once

如果你想了解更多关于它们的信息,请查看维基百科