结构和类层次结构(制作模板)

时间:2015-07-06 08:15:28

标签: c++ oop templates

我有结构recvfrom(3, "HTTP/1.1 500 INTERNAL SERVER ERR"..., 16384, 0, NULL, NULL) = 10510 <VirtualHost *:80> ServerName project.dev ServerAlias www.project.dev <FilesMatch \.php$> SetHandler proxy:fcgi://127.0.0.1:9000 </FilesMatch> #ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/project/web/$1 ## Vhost docroot DocumentRoot "/var/www/project/web" ## Directories, there should at least be a declaration for /var/www/awesome <Directory "/var/www/project/web"> AllowOverride All Order allow,deny Allow from All </Directory> ## Load additional static includes ## Logging ErrorLog "/var/www/project/app/logs/apache2/error.log" ServerSignature Off CustomLog "/var/www/project/app/logs/apache2/access.log" combined ## SetEnv/SetEnvIf for environment variables SetEnv APP_ENV dev ## Custom fragment </VirtualHost> Aa,它继承了一个共同结构Bb和类CcABC,{{ 1}},继承结构ABC。每个都包含虚拟方法。有一个共同的部分,&#34;独特的&#34;参与课程AaBbCc。这是一个代码:

A

似乎不是最佳的。是否可以为BC#include <iostream> using namespace std; struct ABC { virtual ~ABC() { }; virtual void printABC() = 0; virtual void someMethod() = 0; }; struct Aa: ABC { virtual void printA() = 0; }; struct Bb: ABC { virtual void printB()=0; }; struct Cc: ABC { virtual void printC()=0; }; class A: public Aa { public: A() { } virtual ~A() { } //unique part void printA() { cout<<"A!"<<endl; } //common part void printABC() { cout<<"ABC"<<endl; } void someMethod() { cout<<"ABC!"<<endl; } }; class B: public Bb { public: B() { } virtual ~B() { } //unique part void printB(){ cout<<"B!"<<endl; } //common part void printABC() { cout<<"ABC"<<endl; } void someMethod() { cout<<"ABC!"<<endl; } }; class C: public Cc { public: C() { } virtual ~C() { } //unique part void printC(){ cout<<"C!"<<endl; } //common part void printABC() { cout<<"ABC"<<endl; } void someMethod() { cout<<"ABC!"<<endl; } }; 制作模板以及如何制作模板?或者,也许,使用所有常用方法或制作层次结构来创建新类更好。假设,我们不能改变结构:ABC,Aa,Bb,Cc,但我们可以改变A,B,C类。哪种方法更优雅,如何更好地实现它?

2 个答案:

答案 0 :(得分:2)

这取决于您将如何使用您的结构以及您需要哪种多态行为。

如果你愿意从ABC指针处理A B C对象,那么你真的需要这个层次结构 例如:如果你有ABC指针数组指向不同的A B C对象。

如果你在不同的班级中只有一个共同的代码,那么模板会更好,一个功能就足以让你进行治疗

template <class X>
void someMethod (X object) {
}

如果你不能改变ABC,Aa,Bb,Cc结构,那么你就没有其他选择来使用层次结构。

答案 1 :(得分:1)

将公共代码填入专用基类:

struct ABC_CommonCode
{
    //common part
    void printABC() {
        cout<<"ABC"<<endl;
    }
    void someMethod() {
        cout<<"ABC!"<<endl;
    }
};

class A: public Aa, public ABC_CommonCode
{
    ...
};

class B: public Bb, public ABC_CommonCode
{
    ...
};

如果printABC中的实际代码不需要访问您班级的成员,这将有效。但是,您的代码只是一个示例,您的实际代码可能比这更复杂。如果printABC需要使用class A的实例,则可以使用例如委派:

template <class A_or_B_or_C>
struct ABC_CommonCode
{
    static void printABC(A_or_B_or_C& object) {
        cout << "ABC = " << object.GetABC();
        // 100 lines of other code
    }
};

class A: public Aa
{
    // common part
    // repeated in each class, but it's just 3 lines of code
    // regardless of actual implementation
    void printABC() {
        ABC_CommonCode<A>::printABC(*this);
    }
};

您可能还想了解CRTP,但我不确定这里是否有必要。