【发布时间】:2014-08-20 21:09:37
【问题描述】:
我正在尝试编译 here 中提到的桥接模式 C++ 示例代码
但是当我执行g++ -o Bridge Bridge.C时出现编译错误
计划:
#include <iostream>
#include <iomanip>
#include <string>
class TimeImp {
public:
TimeImp(int hr, int min) {
hr_ = hr;
min_ = min;
}
virtual void tell() {
cout << "time is " << setw(2) << setfill(48) << hr_ << min_ << endl; //error
}
protected:
int hr_, min_;
};
class CivilianTimeImp: public TimeImp {
public:
CivilianTimeImp(int hr, int min, int pm): TimeImp(hr, min) {
if (pm)
strcpy(whichM_, " PM");
else
strcpy(whichM_, " AM");
}
/* virtual */
void tell() {
cout << "time is " << hr_ << ":" << min_ << whichM_ << endl;
}
protected:
char whichM_[4];
};
class ZuluTimeImp: public TimeImp {
public:
ZuluTimeImp(int hr, int min, int zone): TimeImp(hr, min) {
if (zone == 5)
strcpy(zone_, " Eastern Standard Time");
else if (zone == 6)
strcpy(zone_, " Central Standard Time");
}
/* virtual */
void tell() {
cout << "time is " << setw(2) << setfill(48) << hr_ << min_ << zone_ << endl; //error
}
protected:
char zone_[30];
};
class Time {
public:
Time(){}
Time(int hr, int min) {
imp_ = new TimeImp(hr, min);
}
virtual void tell() {
imp_->tell();
}
protected:
TimeImp *imp_;
};
class CivilianTime: public Time {
public:
CivilianTime(int hr, int min, int pm) {
imp_ = new CivilianTimeImp(hr, min, pm);
}
};
class ZuluTime: public Time {
public:
ZuluTime(int hr, int min, int zone) {
imp_ = new ZuluTimeImp(hr, min, zone);
}
};
int main() {
Time *times[3];
times[0] = new Time(14, 30);
times[1] = new CivilianTime(2, 30, 1);
times[2] = new ZuluTime(14, 30, 6);
for (int i = 0; i < 3; i++)
times[i]->tell();
}
错误:
]# g++ -o Bridge Bridge.C Bridge.C: 在成员函数‘virtual void TimeImp::tell()': Bridge.C:14: error: no match for ‘operator&)((std::basic_ostream >)std::operator&)(& std::cout)), ((const char)"时间是 ")))), std::setw(2)) & std::basic_ostream<_chart _traits>::operator& ()(std::basic_ostream<_chart _traits>&)) [with _CharT = char, _Traits = std::char_traits] /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/ostream.tcc: 78:注意:std::basic_ostream<_chart _traits>& std::basic_ostream<_chart _traits>::operator& ()(std::basic_ios<_chart _traits>&)) [with _CharT = char, _Traits = std::char_traits] /usr/lib/gcc/x86_64-redhat-linux/4.1。 2/../../../../include/c++/4.1.2/bits/ostream.tcc:90:注意:std::basic_ostream<_chart _traits>& std::basic_ostream<_chart _traits>::operator
这是错误的一部分,它以相同的模式扩展。
我复制粘贴了相同的代码,分析了错误行但无法得到它。
谁能告诉我哪里出错了?
【问题讨论】:
-
也许使用不同的设计模式?先试试适配器。
-
@juanchopanza 我猜它不是设计模式错误,反正我已经尝试过适配器但在不同的代码上运行成功
-
这很有趣,您的标题和代码示例似乎表明您在使用桥接模式时遇到了问题 :-)
-
我认为你放错了“std::”s。
-
是的,实际上我只是添加了让读者知道我正在实现桥模式,也不能完全确定其模式是否错误,因为 AFAIK sourcemaking.com 显示 o/p 为:@ 987654324@