[英]Calling variables from main function to other classes & unable to use this?
當所有類都放在一個包含所有類的主 cpp 文件中時,我能夠運行該程序。 但是,當我將 cpp 文件拆分為各自的 header 文件和 cpp 文件時,出現了一些錯誤。
以下是我正在使用的所有文件(它們都在一個文件夾中):
1) Assignment.cpp (where the main function is at)
2) ShapeTwoD.cpp (Where the parent class is at)
3) ShapeTwoD.h
3) Square.cpp (Child Class)
4) Square.h
5) Rectangle.cpp (Child class)
6) Rectangle.h
問題一:
我有兩個變量:
ShapeTwoD * Shape2D [100];
int size = 0;
以上變量主要在function中。 我嘗試在其他類中調用上述變量,但是有一個錯誤表明它沒有在 scope 中聲明。 我也嘗試添加 extern,但似乎也存在一些錯誤。 我已將變量移至父 class,Shape2D.cpp,但是,主 cpp 無法檢測到變量名稱。 我還公開了:在父 cpp 下。
如果有人可以幫助我,我將非常感激,因為我真的沒時間了。 溫馨問候
Square.cpp:
class Square: public ShapeTwoD{
public:
Square(string name, bool containsWarpSpace, vector < pair<int, int> > vect):ShapeTwoD(name,containsWarpSpace,vect,radius){
this->vect = vect;
this->name = name;
this->containsWarpSpace = containsWarpSpace;
}
double computeArea();
bool isPointOnShape(int x, int y);
bool isPointInShape(int x, int y);
vector<pair<int,int> >allCoord();
void setInnerCoord(vector<pair<int,int> > innerCoord);
vector<pair<int,int> > getInnerCoord();
void setOuterCoord(vector<pair<int,int> > outerCoord);
vector<pair<int,int> > getOuterCoord();
string toString();
void calculatePerimeter();
~Square(){
}
};
double Square::computeArea(){
int width;
int area;
std::vector< pair<int, int> >::iterator result = std::max_element(this->vect.begin(), this->vect.end());
int positionMax = std::distance(this->vect.begin(), result);
pair<int, int> maxCoordinate = this->vect[positionMax];
for(int i = 0; i < this->vect.size(); i++){
if(this->vect[i].second == maxCoordinate.second && this->vect[i] != maxCoordinate){
width = maxCoordinate.first - this->vect[i].first;
area = width * width;
}
}
return area;
}
bool Square::isPointOnShape(int x, int y){
bool result = false;
std::vector< pair<int, int> >::iterator resultMax = std::max_element(this->vect.begin(), this->vect.end());
int positionMax = std::distance(this->vect.begin(), resultMax);
std::vector< pair<int, int> >::iterator resultMin = std::min_element(this->vect.begin(), this->vect.end());
int positionMin = std::distance(this->vect.begin(), resultMin);
pair<int, int> maxCoordinate = this->vect[positionMax];
pair<int, int> minCoordinate = this->vect[positionMin];
for(int i = 0; i < this->vect.size();i++){
if(maxCoordinate.first == x || maxCoordinate.second == y || minCoordinate.first == x || minCoordinate.second == y){
result = true;
}
else{
result = false;
}
}
return result;
}
ShapeTwoD.cpp(父類):
class ShapeTwoD{
protected:
string name;
bool containsWarpSpace;
vector < pair<int, int> > vect;
int radius;
double area;
vector < pair<int, int> > innerCoord;
vector < pair<int, int> > outerCoord;
private:
public:
ShapeTwoD(){
}
ShapeTwoD(string name, bool containsWarpSpace, vector < pair<int, int> > vect, int radius){
this->radius = radius;
this->vect = vect;
this->name = name;
this->containsWarpSpace = containsWarpSpace;
}
virtual double computeArea();
virtual bool isPointInShape(int x, int y);
virtual bool isPointOnShape(int x, int y);
virtual vector<pair<int,int> > allCoord();
virtual void setInnerCoord(vector<pair<int,int> > innerCord);
virtual vector<pair<int,int> > getInnerCoord();
virtual void setOuterCoord(vector<pair<int,int> > outerCoord);
virtual vector<pair<int,int> > getOuterCoord();
virtual string toString();
virtual void calculatePerimeter();
virtual ~ShapeTwoD(){
}
string getName();
bool getContainsWarpSpace();
void setName(string name);
void setContainsWarpSpace(bool containsWarpSpace);
void setCoord(vector < pair<int, int> > v);
vector < pair<int, int> > getCoord();
void setArea(double area);
double getArea();
};
主功能():
int main() {
ShapeTwoD * obj;
int x;
int y;
int radius;
string menu = "0";
while(menu != "5"){
cout <<"----------------------------------" << endl;
cout << "1) Input sensor data" <<endl;
cout << "5) Quit\n" <<endl;
cout << "Please enter your choice:";
cin >> menu;
if(menu == "1"){
cout << "[ Input sensor data ]" << endl;
cout << "Please enter name of shape :";
cin >> shape;
transform(shape.begin(), shape.end(), shape.begin(), ::tolower);
cout << "Please enter special type :";
cin >> specialtype;
transform(specialtype.begin(), specialtype.end(), specialtype.begin(), ::tolower);
if(shape == "rectangle"){
vector < pair<int, int> > temp;
for(int i = 0; i < 4; i++){
cout << "Please enter x-ordinate of pt " << i+1 <<" :";
cin >> x;
cout << "Please enter y-ordinate of pt " << i+1 << " :";
cin >> y;
std::pair <int,int> p;
p = std::make_pair (x,y);
temp.push_back(p);
}
obj = new Rectangle(shape,"",temp);
if(specialtype == "ws"){
obj->setContainsWarpSpace(true);
}
else if (specialtype == "ns"){
obj->setContainsWarpSpace(false);
}
Shape2D[size] = obj;
size ++;
temp.clear();
cout << "\nRecords successfully stored. Going back to main menu ...\n" << endl;
}
else if(shape == "square" ){
vector < pair<int, int> > temp;
for(int i = 0; i < 4; i++){
cout << "Please enter x-ordinate of pt " << i+1 <<" :";
cin >> x;
cout << "Please enter y-ordinate of pt " << i+1 << " :";
cin >> y;
std::pair <int,int> p;
p = std::make_pair (x,y);
temp.push_back(p);
}
obj = new Square(shape,"",temp);
if(specialtype == "ws"){
obj->setContainsWarpSpace(true);
}
else if (specialtype == "ns"){
obj->setContainsWarpSpace(false);
}
temp.clear();
Shape2D[size] = obj;
size ++;
cout << "\nRecords successfully stored. Going back to main menu ...\n" << endl;
}
cout << "\nRecords successfully stored. Going back to main menu ...\n" << endl;
}
對於問題一,最合乎邏輯的地方是 ShapeTwoD 中的ShapeTwoD
成員。 將以下內容放入 shapetwod.h:
class ShapeTwoD {
public:
static vector<shared_ptr<ShapeTwoD>> allShapes;
};
並在 shapetwod.cpp 中定義:
vector<shared_ptr<ShapeTwoD>> ShapeTwoD::allShapes;
然后,您可以使用ShapeTwoD::allShapes
從其他地方訪問此向量。
注意:從 C++17 開始,您可以放棄額外的定義,並使聲明inline static
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.