簡體   English   中英

從另一個Abstract類派生一個Abstract類時,C ++中的類重新定義錯誤

[英]Class redefinition error in C++ while deriving an Abstract Class from another Abstract Class

我是C ++抽象類的新手,我正在嘗試學習如何使用它。 因此,我首先定義了一個僅包含純函數的抽象類,我們將其稱為SceneObj類,到目前為止, SceneObj很好。 然后,我首先定義一個新的抽象類,我將其稱為IScreen 這個新的Class也是另一個抽象類,但是它增加了新的要求。

不幸的是,當嘗試編譯此簡單代碼時,我遇到了以下錯誤: error C2011: 'IScreen' : 'class' type redefinition

我正在使用Visual Studio 2012,並且嘗試編譯的代碼如下:

#include <stdlib.h>
using namespace std;

class SceneObj
{
protected:
    float center;

public:
    virtual void SetCenter(float,float,float) = 0;
    virtual void SetCenter(float) = 0;
    virtual float GetCenter() = 0;
    virtual ~SceneObj();
};

class IScreen : public SceneObj
{
public:
    virtual void SetCenter(float,float,float) = 0;
    virtual void SetCenter(float) = 0;
    virtual float GetCenter() = 0;
    virtual float GetStartCorner() = 0;

    virtual void SetSize(float,float) = 0;
    virtual void SetSize(long) = 0;
    virtual long GetSize() = 0;

    virtual ~IScreen();
};

有人可以指出此代碼的缺陷是什么/在哪里?

編輯:將代碼更改為最少的一個edit2:這在header file並且顯然,如果我將其更改為.cpp它可以毫無問題地進行編譯。 但是我需要/想要在headers聲明我的類,然后在.cpp定義。

C ++程序還使用預處理器定義頭保護。 標頭防護依賴預處理程序變量。 預處理程序變量具有以下兩種可能狀態之一:已定義或未定義。 #define指令采用名稱並將該名稱定義為預處理器變量。 還有兩個指令可以測試是否已定義給定的預處理器變量:如果已定義變量,則#ifdef為true;如果未定義變量,則#ifndef為true。 如果測試為真,則#ifdef#ifndef之后的所有內容都會處理到匹配的#endif為止。 我們可以使用這些工具來防止多重包容,如下所示:

 #ifndef SALES_DATA_H
 #define SALES_DATA_H
 #include <string>
 struct Sales_data {
 std::string bookNo;
 unsigned units_sold = 0;
 double revenue = 0.0;
 };
 #endif  //SALES_DATA_H

例如,在頭文件中,您將找到類似的內容:

#ifndef __*__SceneObj
#define __*__SceneObj__
//Place the abstract class here
#endif

因此,您必須將抽象類放在#define和#endif之間。 (這是編譯器將考慮的定義)。 您只是在cpp文件中沒有這些禮節。 這就是為什么它在那里工作的原因。 另外,嘗試每個頭文件具有一個類,因此不要在同一頭文件上聲明子類。

這意味着您已經定義了IScreen類型。 通常,編譯器會引用重復的定義。

因此,請檢查錯誤消息。

至於您的代碼段則無關緊要。

如果發現錯誤,MS VS通常會給出幾條消息。

另一個原因可能是您在具有main函數的模塊中包括了帶有成員函數定義的cpp模塊。

例如

頭文件:header.h

#include <stdlib.h>
using namespace std;

class SceneObj
{
   //...
};

class IScreen : public SceneObj
{
   //...
};

具有成員函數定義的cpp模塊:module,cpp

#include "header.h"
//...

主模塊

#include "header.h"
#include "module.cpp"
//...

還包括指令

#pragma once

在您的頭文件中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM