以下是我开始上课的标题:
#ifndef CANVAS_
#define CANVAS_
#include <iostream>
#include <iomanip>
#include <string>
#include <stack>
class Canvas
{
public:
Canvas();
void Paint(int R, int C, char Color);
const int Nrow;
const int Ncol;
string Title;
int image[][100];
stack<int> path;
struct PixelCoordinates
{
unsigned int r;
unsigned int c;
} position;
Canvas operator<< (const Canvas& One );
Canvas operator>>( Canvas& One );
};
/*-----------------------------------------------------------------------------
Name: operator<<
Purpose: Put a Canvas into an output stream
-----------------------------------------------------------------------------*/
ostream& operator<<( ostream& Out, const Canvas& One )
{
Out << One.Title << endl;
Out << "Rows: " << One.Nrow << " Columns: " << One.Ncol << endl;
int i,j;
for( i=0; i<One.Nrow; i++)
{
cout<<"\n\n\n";
cout<< " COLUMN\n";
cout<< " 1 2 3";
for(i=0;i<One.Nrow;i++)
{
cout<<"\nROW "<<i+1;
for(j=0;j<One.Ncol;j++) cout<< One.image[i][j];
}
}
return Out;
}
/*-----------------------------------------------------------------------------
Name: operator>>
Purpose: Get a Canvas from an input stream
-----------------------------------------------------------------------------*/
istream& operator>>( istream& In, Canvas& One )
{
// string Line;
// int Place = 0;
// {
// In >> Line;
// if (In.good())
// {
// One.image[Place][0] = Line;
// Place++;
// }
// return In;
#endif
这是我的Canvas类的实现文件:
using namespace std;
#include <iostream>
#include <iomanip>
#include <string>
#include <stack>
#include "proj05.canvas.h"
//----------------Constructor----------------//
Canvas::Canvas()
{
Title = "";
Nrow = 0;
Ncol = 0;
image[][100] = {};
position.r = 0;
position.c = 0;
}
//-------------------Paint------------------//
void Canvas::Paint(int R, int C, char Color)
{
cout << "Paint to be implemented" << endl;
}
我得到的错误是:
proj05.canvas.cpp: In function 'std::istream& operator>>(std::istream&, Canvas&)':
proj05.canvas.cpp:11: error: expected `;' before '{' token
proj05.canvas.cpp:24: error: expected `}' at end of input
从我有限的经验来看,它们看起来像是简单的语法错误,但对于我的生活,我看不出我错过了什么。我知道放一个;在Canvas :: Canvas()的最后是错误的,但这似乎是它所期望的。有人可以为我澄清一下吗?
(另外,我知道&lt;&lt;&gt;&gt;运算符定义的代码看起来很糟糕,但除非这是错误的具体原因,请不要解决它。这是草稿:) )
答案 0 :(得分:5)
标题中的}
遗漏了istream& operator>>( istream& In, Canvas& One )
。
数据成员int image[][100];
也无效,ctor中的image[][100] = {};
也是如此。
您的实现(.cpp)文件应首先#include其对应的标题 。这是确保标头自包含的简单方法。在这种情况下,它会导致标准库头中的语法错误,这会很快向您指出问题出在标题中(因为这是stdlib #includes之前的内容)。
答案 1 :(得分:3)
您错过了}
正文的结束operator>>
。此外,这是不正确的:
using namespace std;
#include <iostream>
订单必须是另一种方式。 GCC的行为不符合要求:如果尚未包含标准标头,则std
必须不可见。所以在下一个更符合要求的编译器上,它可能会很难实现。
此外,在标题中,您应该写std::istream
而不是istream
(ostream
相同,等等)。在您当前的代码中,您的标头依赖于其用户在包含它之前具有typen using namespace std;
,从设计的角度来看这非常难看,因为它使得标头以非显而易见的方式依赖于其用户(通常,它应该是相反的方式)。
答案 2 :(得分:2)
您在运营商&gt;&gt;
的末尾没有结束}答案 3 :(得分:0)
其他人已经回答了你的问题,但这里还有几点:
如果你的插入和提取操作符的定义没有模板化,那么你应该将它们移动到你的实现文件中,只是在头文件中声明它们。这将允许您替换行
#include <iostream>
行
#include <iosfwd>
后者只包含IO流的声明,而不是整个定义。这反过来将转化为包含该标题的每个编译单元的更快编译时间。
另一方面,你也可以选择将这些功能保留在头文件中,但要对它们进行模板化。
template <typename Ch,typename Tr>
std::basic_istream<Ch,Tr>& std::operator>>(std::basic_istream<Ch,Tr>& in,
Canvas& o)
{
// ...
}
这将为您提供额外的灵活性,支持任何流,但代价是您现在拥有的编译时间相同。
答案 4 :(得分:0)
初始化类的常量成员的方式也有错误。
您必须使用初始化列表
Canvas::Canvas()
: Nrow(0), Ncol(0)
{
Title = "";
//Nrow = 0; - this is an attempt to change the value of a const, which was already constructed.
//Ncol = 0; - same as above
//image[][100] = {};
position.r = 0;
position.c = 0;
}