我一直在圈子里试图在C++中正确实现继承,谷歌并没有真正帮助.我有工作的Java代码,我正在移植到C++,它很大程度上依赖于接口.
我正在为一些遗传算法编写测试平台,所以我需要通用变量,允许任何类型的类与它们相关联,允许执行相同的功能,而不管具体类型如何.例如,我需要一个'crossover'类型,它允许任何类型的交叉存储在变量中,并允许在其上执行相同的交叉方法集.
我用纯虚函数"performCrossover"创建了一个接口.然后由通用的"交叉"类继承,然后由各个交叉类型继承.
目前,链接器抱怨我正在重新定义我所遇到的"problem :: performCrossover",但这正是我所需要的.我可以通过在通用交叉类中使函数纯虚拟来解决这个问题,但是我无法实例化它,这正是我所需要的.
我也尝试过更改它"crossovername :: performCrossover",但后来我得到'继承成员是不允许的'.这就是我现在所处的位置.
我的界面:
class crossoverinterface {
public:
virtual genome** performCrossover(genome* firstParent, genome* secondParent) = 0;
};
Run Code Online (Sandbox Code Playgroud)
通用交叉类型我需要能够用任何类型的交叉实例化.
class crossover: public crossoverinterface{
public:
crossover() {};
crossover(int genomeLength, int nObjectives);
~crossover();
genome** preCrossover(genome* firstParent, genome* secondParent);
virtual genome** performCrossover(genome* firstParent, genome* secondParent);
private:
genome** solution;
int genomeLength;
int nObjectives;
};
Run Code Online (Sandbox Code Playgroud)
子类1的示例:
class simulatedbinarycrossover: public crossover {
public:
simulatedbinarycrossover(int genomeLength, int nObjectives, double lowerBound, double upperBound);
};
genome** simulatedbinarycrossover::performCrossover(genome* firstParent, genome* secondParent){
...code...
}
Run Code Online (Sandbox Code Playgroud)
最后是错误:"performCrossover':成员函数未在'simulationbinarycrossover'中声明"Intellisense称它为'继承的成员不被允许'.
希望我有所了解,尝试和描述这是一个非常棘手的问题. …
我正在编写一个带有以下函数的互斥保护堆栈,用于从可能失败的顶部弹出一个值:
bool try_pop(T& value)
{
std::lock_guard<std::mutex> lock(mutex_);
if (ctr_.empty())
return false;
value = std::move(ctr_.back());
ctr_.pop_back();
return true;
}
Run Code Online (Sandbox Code Playgroud)
我正在使用a std::vector作为底层容器.为了在堆栈中存储不可复制的T(例如std::unique_ptr),我习惯于std::move从向量的背面取T,否则进行复制.两个问题:a)这是正确的吗?T会被移动还是被复制?b)我担心异常安全.如果移动抛出,则不会弹出堆栈,但最高值可能处于半移动状态.这是可能的,我该如何解决?
给定字符串A,BI需要计算B成为A的插入,删除和替换的数量.对此有什么好的算法?
我试图引用mycustompath来自当前类的不同类的cstring .
CString test = CBar::mycustompath + _T("executables\\IECapt");
Run Code Online (Sandbox Code Playgroud)
但我得到了这个错误:
错误C2597:非法引用非静态成员'CBar :: mycustompath'c:\ work\b.cpp 14
如何解决这个问题?
所以我在main方法中有一个C字符串(字符数组),当我将它作为参数传递给另一个方法时,它的大小会发生变化.
void method(char* arr){
printf( "%u\n", sizeof(arr) ); //returns 4, in my program.
arr = "hello "; //executes just fine
char arr2[9] = "people";
strcat(arr, arr2); // (1) here is where it crashes down
int i = 0; while(i < sizeof(arr2)){ arr[i+6] = arr2[i]; i++;} // (2) this causes it to crashdown too
}
int main(){
char array[33];
printf("%u\n", sizeof(array) ); //returns 33, in my program.
method(array);
}
Run Code Online (Sandbox Code Playgroud)
为什么会这样?,我该如何解决?这是否意味着我无法为C字符串添加更多值?我怀疑这可能是我的程序不断崩溃的原因(每当我尝试添加n时).标记为(1)和(2)的行也不起作用.有解决方法吗?
好的,这就是我们正在做的事情.我们正在查看json请求/响应字符串.
代码段(假设使用了相关模块):
if( open( my $json_file, $filename ))
{
my $json = JSON->new;
my $data = $json->decode(<$json_file>);
close( json_file );
$request_uri = $data->{'input'}{'Headers'}{'REQUEST_URI'};
}
Run Code Online (Sandbox Code Playgroud)
所以$ request_uri看起来像
/user/12345?param1=4¶m2=9956
Run Code Online (Sandbox Code Playgroud)
虽然我可以使用正则表达式或其他任何东西从中提取数据,但我确信这是一种常见的情况,并且应该有一种方法将这个特定的REST解析为其部分,然后将它们解压缩出来.我在REST手册中没有看到这一点,它似乎更多地是关于构造请求.
让我们说有
class Foo{
public:
bool error;
......
bool isValid(){return error==false;}
};
Run Code Online (Sandbox Code Playgroud)
在某个地方
Foo *aFoo=NULL;
Run Code Online (Sandbox Code Playgroud)
我通常会这样做 if (aFoo!=NULL && aFoo->isValid()).....
但是如果在isValid方法中我测试了nullity:
bool isValid(){return this!=NULL && error==false)
Run Code Online (Sandbox Code Playgroud)
这将通过简单的调用简化外部测试 if (aFoo->isValid())
我已经在一些编译器中对它进行了测试并且它可以工作但是我想知道它是否是标准的并且在移植到其他环境时可能会导致问题.
当bad_alloc在构造函数中抛出异常时,在该构造函数中创建了多个对象,必须采取什么措施来清理内存.防爆.
class Object
{
private:
A * a;
B * b;
public:
Object()
{
a= new A();
b= new B(); //So if a bad_alloc is called here, how is a deleted???
}
}
Run Code Online (Sandbox Code Playgroud)
我的直觉是将每个调用new放在一个单独的try catch块中,并删除new之前调用过的所有对象,但这太冗长了(第一次尝试bloc不调用析构函数,第二次调用第一次调用,第三次调用前两个等).我的问题是:处理这个问题最常见的方法是什么?
另外,假设类对象包含一个不是用new创建的对象(因为它在栈中),它的析构函数是自动调用的吗?
我已经用这个约2天了.我被困了,有一个相当简单的烦恼,但我无法解决它.
我的程序基本上从PHP脚本中获取TCP连接.并且发送的消息存储在char buffer[1024];.好的,这个缓冲区变量包含一个唯一键,它与a进行比较char key[1024] = "supersecretkey123";
问题本身就是这两者并不相同 - 无论我做什么.我一直在将缓冲区和键变量打印在彼此之上,看起来它们是100%相同的.但是我的均衡测试仍然失败.
if(key == buffer) { // do some thing here etc }
Run Code Online (Sandbox Code Playgroud)
然后我开始在互联网上搜索可能出错的一些信息.我后来意识到这可能是一些令我讨厌的逃脱角色.但我无法打印它们,删除它们甚至确保它们在那里.所以这就是为什么我被困 - 当缓冲变量与关键变量匹配时,如何使这些相等的想法.除非手动修改密钥的声明,否则密钥不可能.程序本身正在接收信息并"正确"发回信息.
谢谢.
我有2000个 vector<vector<bool>>,每个vector<bool>包含200个元素,我将对这个向量矢量进行排序.假设元素vector<bool>是一个二进制数.
原始数据:
vector 1: 1,1,1
vector 2: 1,0,1
vector 3: 0,0,0
vector 4: 1,0,0
Run Code Online (Sandbox Code Playgroud)
排序后:
vector 3: 0,0,0
vector 4: 1,0,0
vector 2: 1,0,1
vector 1: 1,1,1
Run Code Online (Sandbox Code Playgroud)
可以使用sort一个特殊的谓词,但令人惊讶的是,当我在sort没有谓词的情况下调用时,它似乎无论如何都可以工作.
vector<bool> A = {1, 1, 1};
vector<bool> B = {1, 0, 1};
vector<bool> C = {0, 0, 0};
vector<bool> D = {1, 0, 0};
vector < vector<bool> > v = {A,B,C,D};
sort(v.begin(),v.end());
Run Code Online (Sandbox Code Playgroud)
并且顺序为上面的"排序后".
为什么没有特殊的谓词呢?
像标题一样.作为一名新的程序员,了解我的项目机制以及使用它们的不同之处非常重要.任何人都可以给我一个答案,谢谢!
c++ ×8
c ×2
algorithm ×1
bad-alloc ×1
c++11 ×1
constructor ×1
exception ×1
inheritance ×1
interface ×1
null ×1
perl ×1
rest ×1
visual-c++ ×1