gpt4 book ai didi

c++ - 调用错误的纯虚方法

转载 作者:太空狗 更新时间:2023-10-29 23:46:20 24 4
gpt4 key购买 nike

我有以下定义:

class PartitioningMethod {
public:
virtual void addConstraints(ConstraintManager& cm) = 0;
virtual bool hasMoreConstraints() = 0;
virtual void setQuery(const Query& q) = 0;
virtual ~PartitioningMethod(){ }
};


class Random : public PartitioningMethod {
private:
vector< ref<Expr> > constraints;
vector< ref<Expr> >::iterator it;
vector< ref<Expr> >::iterator end;
int numConstraints;
RNG theRNG;

public:
void setQuery(const Query& q) {

constraints.clear();

//Set random number
//srand ( unsigned ( time (NULL) ) * theRNG.getInt32() );
srand ( theRNG.getInt32() );

//Copy constraints
copy(q.constraints.begin(),q.constraints.end(),std::back_inserter(constraints));

//Shuffle Randomly
std::random_shuffle(constraints.begin(),constraints.end(), p_myrandom);

it = constraints.begin();
end = constraints.end();
numConstraints = constraints.size();
}

void addConstraints(ConstraintManager& cm) {
int step = rand() % numConstraints + 1;
while(step != 0) {
cm.addConstraint(*it);
++it;
--step;
--numConstraints;
}
}

bool hasMoreConstraints() {
return it != end;
}
};


bool PartitioningSolver::computeInitialValues(const Query& query,
const std::vector<const Array*> &objects,
std::vector< std::vector<unsigned char> > &values,
bool &hasSolution) {

fprintf(stderr,"INIT\n");
// If there are no constraints in the query
if(query.constraints.size() == 0 || query.constraints.size() == 1)
return solver->impl->computeInitialValues(query, objects, values, hasSolution);

// If the number constraints in the query are > 0
method->setQuery(query);

ConstraintManager cm;
ref<Expr> expr = query.expr;

fprintf(stderr,"Begin partitioning\n");
fprintf(stderr,"---------------------\n");

while(method->hasMoreConstraints()){
fprintf(stderr, "HERE");
//Add Constraints
method->addConstraints(cm);

//Construct a query
Query temp_query(cm,expr);

ExprPPrinter::printQuery(std::cerr,temp_query.constraints,temp_query.expr);
fprintf(stderr,"---------------------\n");

//Query STP to check if satisfiable
values.clear();

if(!solver->impl->computeInitialValues(temp_query, objects, values, hasSolution))
return false;

//If not, return immediately (a win!)
if(!hasSolution)
return true;

//If a solution is returned, check if the solution satisfies the entire set of constraints
vector<const Array*> obj = objects;
Assignment solution(obj, values);
bool satisfiesAll = checkSolution(solution, query.constraints);

// fprintf(stderr,"Satisfies all: %i\n", satisfiesAll);

// If it is successful, return the solution (a win again!),
if(satisfiesAll)
return true;

// If not add more constraints (if there is more) and repeat
}
return true;
}

分区求解器类的部分定义:

class PartitioningSolver : public SolverImpl {
private:
Solver* solver;
PartitioningMethod* method;
bool checkSolution(Assignment& solution, const ConstraintManager& constraints);
public:
PartitioningSolver(Solver *s, PartitioningMethod* pm) : solver(s), method(pm) { }
~PartitioningSolver() { delete solver; delete method; }
};

很抱歉粘贴了这么长的代码片段,但我已经为此工作了几个小时,并且不断收到错误

pure virtual method called
terminate called without an active exception

我不确定哪里出了问题。它似乎在 fprintf(stderr,"Begin partitioning\n"); 所在的 computeInitialValues 函数中失败。我尝试添加打印语句作为最后的手段,但即使他们不打印任何东西。任何想法表示赞赏。

编辑:
好的,所以我将名称 Random 更改为 Ran,它开始工作了。我正在动态创建此类实例作为 new Random() 的参数我猜它与另一个构造函数或其他我不知道的东西混淆了..

最佳答案

还有另一种类型的错误,可能会导致打印此错误消息。

您删除了该对象,稍后您尝试对其进行调用。这是未定义的行为,在某些编译器上,如果幸运的话,您会看到这种情况。尝试使用 valgrind 运行您的代码。

http://tombarta.wordpress.com/2008/07/10/gcc-pure-virtual-method-called/

关于c++ - 调用错误的纯虚方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12044819/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com