我有Dmx
一個嵌套類的類touchSlider
。所以在我的檔案中有這些類之前,我只是在類中main.cpp
創建了一個物件陣列并且它作業正常。touchSlider
Dmx
我怎樣才能在這里用不同的頭檔案實作這個?編譯器給出錯誤資訊: invalid use of incomplete type 'class Dmx::touchSlider'
物件陣列是:touchSlider slider[10] = {50,130,210,290,370,50,130,210,290,370};
dmx.h
// dmx.h
#ifndef dmx_h
#define dmx_h
class Dmx {
public:
byte number;
Dmx(byte numberA) {
number = numberA;
}
void settingsDisplay();
class touchSlider; // declaration of nested class
touchSlider slider[10] = {50,130,210,290,370,50,130,210,290,370};
};
#endif
觸摸滑塊.h
// touchSlider.h
#ifndef touchSlider_h
#define touchSlider_h
#include "dmx.h"
class Dmx::touchSlider{
private:
int pos;
public:
touchSlider(int posA){
pos = posA;
}
void printChannel();
};
#endif
主檔案
// main.cpp
#include "dmx.h"
#include "touchSlider.h"
Dmx dmx[10] = {Dmx(1), Dmx(2),Dmx(3), Dmx(4), Dmx(5), Dmx(6), Dmx(7), Dmx(8), Dmx(9), Dmx(10)};
void Dmx::settingsDisplay() {
// do something
}
void Dmx::touchSlider::printChannel() {
// do something
}
我以前的代碼(效果很好)在同一個檔案中的兩個類看起來像這樣:
class Dmx {
public:
byte number;
Dmx(byte numberA) {
number = numberA;
}
void channelDisplay(){
}
void settingsDisplay(){
}
class touchSlider{
private:
int pos;
public:
touchSlider(int posA){
pos = posA;
}
void setChannel(/* some arguments*/){
}
void printChannel();
}
};
touchSlider slider[10] = {50,130,210,290,370,50,130,210,290,370};
};
Dmx dmx[10] = {Dmx(1), Dmx(2),Dmx(3), Dmx(4), Dmx(5), Dmx(6), Dmx(7), Dmx(8), Dmx(9), Dmx(10)};
uj5u.com熱心網友回復:
為了能夠創建一個陣列:
touchSlider slider[10] = {50,130,210,290,370,50,130,210,290,370};
您需要可用的類定義,因為編譯器需要知道
- 正在使用的結構或類的大小和
- 如果有合適的建構式可用。
您現在有兩個選擇,或者您在標頭中提供類定義,但在源檔案中實作該類,例如:
// header:
class Dmx
{
public:
// ...
class TouchSlider
{
public:
// only DECLARE here:
TouchSlider(int posA);
void setChannel(/* some arguments*/);
void printChannel();
};
};
// source:
Dmx::TouchSlider::TouchSlider(int posA)
: pos(posA) // note: prefer the initialiser list!
{ }
void Dmx::TouchSlider::setChannel(/* some arguments*/)
{
}
// ...
或者您按照您的意圖隱藏實作,但是您需要動態分配記憶體(這是 PImpl 習慣用法) - 最好在 a 的幫助下std::unique_ptr
:
class Dmx
{
public:
// ...
private:
class TouchSlider; // just declare
std::unique_ptr<TouchSlider[]> sliders;
};
重要(參見cppreference),但:
std::unique_ptr
可以為不完整的型別 T 構造,以便于在 pImpl 成語中用作句柄。如果使用默認洗掉器,則 T 必須在呼叫洗掉器的代碼點完成,這發生在解構式、移動賦值運算子和重置成員函式中std::unique_ptr
。
即你不能在頭檔案中實作例如你的類的解構式,但也需要在源檔案中這樣做——在嵌套類的完整定義之后——就像任何可能重新分配另一個陣列的函式一樣。
避免了手動記憶體管理的std::unique_ptr
必要性(參見規則三/五),另一方面,該類變得不可復制(但您可以通過提供自己的自定義復制建構式和賦值來解決,同時默認移動建構式和賦值)。
uj5u.com熱心網友回復:
為了創建陣列,touchSlider
編譯器需要定義一個touchSlider
類。所以正如寫的那樣,這是行不通的。
在給出的代碼中
touchSlider slider[10] = {50,130,210,290,370,50,130,210,290,370};
編譯器需要知道一個物件有多大touchSlider
,這樣它才能為一個物件分配足夠的記憶體Dmx
。它還需要知道 atouchSlider
可以從 a 構造int
。這兩件事都需要完整的定義touchSlider
。
現在,也許您可??以使用一些變化來實作您的目標,但是如果沒有更多細節,就很難提出任何建議。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/496785.html