簡體   English   中英

C ++初始化常量和繼承

[英]C++ initializing constants and inheritance

我想在子類而不是基類中初始化常量。 並使用它來擺脫動態內存分配(我已經知道數組大小,並且會有一些具有不同常量的子類)。
所以我嘗試:

class A {
public:
    const int x;

    A() : x(0) {}
    A(int x) : x(x) {}
    void f() {
        double y[this->x];
    }
};

class B : A {
    B() : A(2) {}
};

非常簡單,但編譯器說:

錯誤C2057:預期的常量表達式

我怎么能對編譯器說它真的是一個常量?

但這不是一個常數。 它仍然可以由構造函數修改。 對於數組的大小,只允許編譯時常量。 當編譯器說“常量表達式”時,它並不意味着表達式返回一個常量值,而是一個常量,例如“52”或“45”或沿這些行的某些東西。

請改用std::vector

編輯:響應“我已經知道數組大小,並將有一些具有不同常量的子類”

唯一的方法是使用模板。

template<size_t x>
class A {
public:
    void f() {
        double y[x];
    }
};

typedef A<2> B;

您期望的行為可以使用以下模板實現。

請注意,這實際上是不可靠的,令人作嘔的,並且只能用作“樣本”。 請改用std::vector

template <size_t a = 0>
class A {
public:
   A() { }

   void f() {
      int y[a];
      y[0] = 5;
   }
};

class B : A<2> {
   B() { }
};

void main() {
   A<1> a;
   a.f();

   // Undefined behaviour - creating an array of size 0
   // At least, MSVS2008 treats it as an error :)
   // A<0> a_;
}

有“常數”,然后就是“常數”。 如果你想像這樣在堆棧上分配一個數組,編譯器需要在編譯時獲得數組的長度,並且根據你在那里給出的數據,它無法解決這個問題。 有趣的是,gcc支持擴展(在標准C ++中不支持),允許為可變長度分配堆棧。

我不知道它是否適用於您的目的,但一種可能性是使其成為模板參數:

template <int size>
class A { 
    double y[size];
};

在這種情況下,您可能希望在B中創建A的實例而不是使用繼承。

另一個明顯的可能性是使用tr1::array對象。 這也是一個模板,所以這個想法幾乎相同,但它已經編寫,測試和工作,所以你可以避免這一切。 如果您的編譯器不提供TR1類,Boost有一個大致符合的實現( boost::array )。

暫無
暫無

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

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