桥接模式 C++ 代码编译错误

Posted

技术标签:

【中文标题】桥接模式 C++ 代码编译错误【英文标题】:bridge pattern C++ code compile error 【发布时间】: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@ 【参考方案1】:

std::setfilltakes a char,你传递给它一个int

试试:

cout << "time is " << setw(2) << setfill(' ') << hr_ << min_ << endl;

【讨论】:

字符不再是数字了吗?我错过了什么吗? @πάνταῥεῖ:你说得对,我专注于如何修复错误,而不是解释为什么会出现错误(感谢 Mike)。

以上是关于桥接模式 C++ 代码编译错误的主要内容,如果未能解决你的问题,请参考以下文章

在编译c++代码时出现如下错误: 望速度解答,很急。。谢谢!

C++ 唯一指针;为啥这个示例代码会出现编译错误?错误代码太长了,我无法指定

由于未定义的行为或编译器错误导致 C++ 代码崩溃?

编译 boost c++ 代码错误

Boost C++ 示例代码 - 静态编译错误

初学者在 C++ 中调用函数,代码编译数学是错误的