C++ compiler error: “invalid declarator before”
C++ compiler error: “invalid declarator before”
这是我的代码。编译时出现错误
invalid declarator before ‘geometry’
在第 16 行和第 48 行,我不确定我做错了什么。请指教
#include <iostream>
#include <memory>
#include <vector>
using namespace std;
class FactGeometry { //Factory class
public:
static std::shared_ptr<FactGeometry>geometry( int choice );
virtual void calcArea() = 0;
};
class CalcRectangle :public FactGeometry {
void calcArea() {
double ll, bb, Area;
std::cout << "\nEnter the length = ";
std::cin >> ll;
std::cout << "\nEnter the breadth = ";
std::cin >> bb;
Area = ll * bb;
std::cout << "\nArea = " << Area;
}
}; //end class
class CalcTraingle :public FactGeometry {
void calcArea() {
double bb, hh, Area;
std::cout << "\nEnter the base = ";
std::cin >> bb;
std::cout << "\nEnter the height = ";
std::cin >> hh;
Area = 0.5 * bb * hh;
std::cout << "\nArea = " << Area;
}
};
FactGeometry std::shared_ptr<FactGeometry>geometry( int choice ) {
switch ( choice ) {
case 1: return shared_ptr<FactGeometry>( new CalcRectangle );
break;
case 2: return shared_ptr<FactGeometry>( new CalcTraingle );
break;
default: std::cout << "EXIT";
break;
}
} //end class
int main() {
cout << "Hello World";
int choice;
std::vector<std::shared_ptr<FactGeometry>> table;
while ( 1 ) {
std::cout << "1. Rectangle 2. Triangle";
std::cout << "Enter Choice :";
std::cin >> choice;
if ( ( choice != 1 ) || ( choice != 2 ) )
break;
else
table.push_back( FactGeometry::make_shared<FactGeometry>geometry( choice ) );
}
for ( int i = 0; i < table.size(); i++ ) {
table[i];
}
return 0;
}
我正在为工厂方法编写代码 class 但我收到此错误,因为“几何”之前的声明符无效。我不确定我做错了什么
检查定义静态方法的签名 geometry
。将其更改为
std::shared_ptr<FactGeometry> FactGeometry::geometry(int choice)
这应该可以修复您的编译器错误。
您的代码有几处错误。
编译器抱怨的行是 FactGeometry
的静态 geometry
方法的定义。一个定义的结构是:
<Return Type> <Class>::<Method Name>(<Parameters>) { ... }
geometry
returns一个shared_ptr<FactGeometry>
属于classFactGeometry
。所以应该定义为
std::shared_ptr<FactGeometry> FactGeometry::geometry(int choice){
// code
}
如果你修复这个问题,编译器会抱怨这一行
table.push_back(FactGeometry::make_shared<FactGeometry>geometry(choice));
这里我觉得你不明白make_shared
是什么意思。它是一个辅助函数,您可以调用它来创建所需类型的新 shared_ptr
,并采用与该类型的构造函数相同的参数。
由于您的 FactGeometry
是抽象的 class make_shared<FactGeometry>
将无法工作。
我想你想打电话给 FactGeometry::geometry(choice)
。
在 geometry
内,您可以调用例如
return make_shared<CalcRectangle>();
而不是
return shared_ptr<FactGeometry>(new CalcRectangle());
对于在 C++ 中遇到类似“invalid declarator before”问题的人,即使您编写的语法看起来不错,请检查上一行中的分号。
请检查您是否遗漏了在前面的任何行中添加分号 (;)
这是我的代码。编译时出现错误
invalid declarator before ‘geometry’
在第 16 行和第 48 行,我不确定我做错了什么。请指教
#include <iostream>
#include <memory>
#include <vector>
using namespace std;
class FactGeometry { //Factory class
public:
static std::shared_ptr<FactGeometry>geometry( int choice );
virtual void calcArea() = 0;
};
class CalcRectangle :public FactGeometry {
void calcArea() {
double ll, bb, Area;
std::cout << "\nEnter the length = ";
std::cin >> ll;
std::cout << "\nEnter the breadth = ";
std::cin >> bb;
Area = ll * bb;
std::cout << "\nArea = " << Area;
}
}; //end class
class CalcTraingle :public FactGeometry {
void calcArea() {
double bb, hh, Area;
std::cout << "\nEnter the base = ";
std::cin >> bb;
std::cout << "\nEnter the height = ";
std::cin >> hh;
Area = 0.5 * bb * hh;
std::cout << "\nArea = " << Area;
}
};
FactGeometry std::shared_ptr<FactGeometry>geometry( int choice ) {
switch ( choice ) {
case 1: return shared_ptr<FactGeometry>( new CalcRectangle );
break;
case 2: return shared_ptr<FactGeometry>( new CalcTraingle );
break;
default: std::cout << "EXIT";
break;
}
} //end class
int main() {
cout << "Hello World";
int choice;
std::vector<std::shared_ptr<FactGeometry>> table;
while ( 1 ) {
std::cout << "1. Rectangle 2. Triangle";
std::cout << "Enter Choice :";
std::cin >> choice;
if ( ( choice != 1 ) || ( choice != 2 ) )
break;
else
table.push_back( FactGeometry::make_shared<FactGeometry>geometry( choice ) );
}
for ( int i = 0; i < table.size(); i++ ) {
table[i];
}
return 0;
}
我正在为工厂方法编写代码 class 但我收到此错误,因为“几何”之前的声明符无效。我不确定我做错了什么
检查定义静态方法的签名 geometry
。将其更改为
std::shared_ptr<FactGeometry> FactGeometry::geometry(int choice)
这应该可以修复您的编译器错误。
您的代码有几处错误。
编译器抱怨的行是 FactGeometry
的静态 geometry
方法的定义。一个定义的结构是:
<Return Type> <Class>::<Method Name>(<Parameters>) { ... }
geometry
returns一个shared_ptr<FactGeometry>
属于classFactGeometry
。所以应该定义为
std::shared_ptr<FactGeometry> FactGeometry::geometry(int choice){
// code
}
如果你修复这个问题,编译器会抱怨这一行
table.push_back(FactGeometry::make_shared<FactGeometry>geometry(choice));
这里我觉得你不明白make_shared
是什么意思。它是一个辅助函数,您可以调用它来创建所需类型的新 shared_ptr
,并采用与该类型的构造函数相同的参数。
由于您的 FactGeometry
是抽象的 class make_shared<FactGeometry>
将无法工作。
我想你想打电话给 FactGeometry::geometry(choice)
。
在 geometry
内,您可以调用例如
return make_shared<CalcRectangle>();
而不是
return shared_ptr<FactGeometry>(new CalcRectangle());
对于在 C++ 中遇到类似“invalid declarator before”问题的人,即使您编写的语法看起来不错,请检查上一行中的分号。
请检查您是否遗漏了在前面的任何行中添加分号 (;)