簡體   English   中英

C ++結構和“錯誤:ISO C ++禁止聲明'…',且不帶類型”

[英]C++ Struct and “error: ISO C++ forbids declaration of '…' with no type”

我試圖用C ++編寫類和結構:

using namespace std;

struct Position { 
    int x; 
    int y;  
};

class Maze {
    Position pos;
    pos.x = 0;
    pos.y = 0;
};

int main() {
    return 0;
}

但是當我嘗試編譯它時會出現一些錯誤:

(gcc版本4.3.2)

10: error: ISO C++ forbids declaration of 'pos' with no type
10: error: expected ';' before '.' token
11: error: ISO C++ forbids declaration of 'pos' with no type
11: error: expected ';' before '.' token

看起來這段代碼與C ++教程Struct中的代碼幾乎相同。

關於“錯誤:ISO C ++禁止聲明無類型的'...'”的其他答案(例如this )建議添加名稱空間,但是我很難看到它在這里不起作用的原因是什么。

總而言之,我有以下問題:

  1. 在這種情況下,此錯誤實際上意味着什么?
  2. 該錯誤通常意味着什么?
  3. 為什么此代碼不起作用?
  4. 如何使其運作?

如果有人可以給出答案和/或研究/閱讀的方向,我將不勝感激。

這段代碼

pos.x = 0;
pos.y = 0;

需要一個功能。 一種方法是將其放入構造函數中,例如:

class Maze {
    Position pos;
public:
    Maze() {
        pos.x = 0;
        pos.y = 0;
    }
};

請注意,我將構造函數公開,否則您將無法使用Maze類

編輯:實際回答您的問題:

在這種情況下,此錯誤實際上意味着什么? 編譯器不知道該如何處理pos.x = 0因為此時它需要聲明,而不是代碼。

該錯誤通常意味着什么? 這通常意味着編譯器不知道如何處理您編寫的聲明。

為什么此代碼不起作用? 因為您將可執行代碼放在應該放置聲明的位置。

如何使其運作? 參見上面的代碼。

由於此問題的標題為“ ISO C ++禁止聲明沒有類型的“東西” ”,因此這是一個更通用的答案。 C ++無法找到類型,因此只需指定類型即可。

就我而言,只有添加前向聲明后,我才能解決它。

A.hpp

class A
{
};

B.hpp

#include "A.hpp"
class B
{
public:
  A* inst;
};

這導致ISO C ++的錯誤,禁止無類型的A聲明。

因此,我對B.hpp進行了如下更改:

#include "A.hpp"
class A;//the forward declaration
class B
{
public:
  A* inst;
};

它編譯良好!

首先,您不能在課程的頂層初始化成員:

class Maze {
    Position pos;
    pos.x = 0;
    pos.y = 0;
};

您必須提供某種構造函數,並且,如果您處於該職位的默認狀態下,則可能是您要完成初始化的地方。 對象通常應負責其自身的初始化和拆除:

using namespace std;

struct Position {
    int x;
    int y;
    Position() : x(0), y(0) {}
};

class Maze {
    Position pos;
};

int main () {
    return 0;
}

第10和11行是

pos.x = 0;
pos.y = 0;

編譯器假設您要聲明名為“ pos.x”和“ pos.y”的變量,並且抱怨是因為您沒有告訴它這些變量的類型。

正如The Dark所建議的那樣,要做的是將這兩個分配移動到構造函數中。

但是,如果我不確定以后事情會變得多么復雜,我可以這樣寫:

class Position {
  private:
    int x;
    int y;
  public:
    Position(int x0, int y0) : x(x0), y(y0) {
        // Any other initialization here.
    }
    inline int getX() { return x; }
    inline int getY() { return y; }
    inline void setX(int x0) { x = x0; }
    inline void setY(int y0) { y = y0; }
}

class Maze : public Position {
    Maze() : Position(0,0) {
        // Any other initialization here.
    }
}

有人會說這太過分了。 很可能,我不知道您最后的問題到底有多復雜。 如果您不確定,也可以選擇上課。

類的全部要點是數據封裝。 不要暴露任何不必要的東西,這樣就不必擔心其他代碼會以意想不到的方式更改值。 使用一個結構也許就足夠了,但是如果不是這樣,那么返回並從一個結構轉換為一個類可能比現在僅進行一個類要困難得多。

暫無
暫無

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

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