我有结构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
和类Cc
,ABC
,{{ 1}},继承结构A
,B
,C
。每个都包含虚拟方法。有一个共同的部分,&#34;独特的&#34;参与课程Aa
,Bb
,Cc
。这是一个代码:
A
似乎不是最佳的。是否可以为B
,C
,#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类。哪种方法更优雅,如何更好地实现它?
答案 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,但我不确定这里是否有必要。