错误:构造函数将自身委托给问题

时间:2018-12-07 06:39:49

标签: c++ constructor

#include "RandomGeneratorNAG.h"
RandomGeneratorNAG::RandomGeneratorNAG():RandomGeneratorNAG()  {
}

/** Standard constructor.
 * \param seed Seed for the randomGenerator
 */
RandomGeneratorNAG::RandomGeneratorNAG(int seed) {
    g05cbc(seed);
}

/** Standard destructor.
 *
 */
RandomGeneratorNAG::~RandomGeneratorNAG() {
}

在这一点上,我收到错误消息“错误:构造函数委托给它自己”。有什么问题吗?

将第一个功能更改为

RandomGeneratorNAG::RandomGeneratorNAG(){
}

我收到错误消息

  

“错误:没有匹配的函数来调用   'RandomGenerator :: RandomGenerator()'“

在这一点上。

RandomGeneratorNAG.h如下所示。

#ifndef RANDOMGENERATOR_RANDOMGENERATORNAG_H_
#define RANDOMGENERATOR_RANDOMGENERATORNAG_H_

#include "RandomGenerator.h"


/// To use this class, you must have WITH_NAG enabled in CMake.
class RandomGeneratorNAG: public RandomGenerator {
public:
    RandomGeneratorNAG();
        explicit RandomGeneratorNAG(int seed);
    virtual ~RandomGeneratorNAG();

    void getUniformRandomInt(int lowerBound, int upperBound, int* randNumber) ;
    void getUniformRandomInt(int lowerBound, int upperBound, std::vector<int>* randNumbers, std::size_t  size) ;
    void getUniformRandomDouble(double lowerBound, double upperBound, double* randNumber) ;
    void getUniformRandomDouble(double lowerBound, double upperBound, std::vector<double>* randNumbers, std::size_t  size) ;

    void getNormalRandomInt(double mu, double sigma, int* randNumber) ;
    void getNormalRandomInt(double mu, double sigma, std::vector<int>* randNumbers, std::size_t  size) ;
    void getNormalRandomDouble(double mu, double sigma, double* randNumber) ;
    void getNormalRandomDouble(double mu, double sigma, std::vector<double>* randNumbers, std::size_t  size) ;
};

#endif /* RANDOMGENERATOR_RANDOMGENERATORNAG_H_ */

此外,RandomGenerator.h如下所示。

#ifndef _RandomGenerator_hpp_
#define _RandomGenerator_hpp_

#include <vector>
#if BUILD_TESTS
//Necessary include to test private functions with googleTest
#include "gtest/gtest_prod.h"
#endif

#include "../Parameter/Parameter.h"
#include "../Writer/Writer.h"

class RandomGenerator {
#if BUILD_TESTS
    FRIEND_TEST(RandomGeneratorTest, seed);
#endif
protected:
    int seed;
    static int createSeed();
public:

    virtual ~RandomGenerator();

    RandomGenerator(int seed);

    int getSeed(){return seed;}

    static RandomGenerator* factory(Parameter* parameter, Writer* writer);

    virtual void getUniformRandomInt(int lowerBound, int upperBound, int* randNumber) = 0;

    virtual void getUniformRandomInt(int lowerBound, int upperBound, std::vector<int> *randNumbers, std::size_t size) = 0;

    virtual void getUniformRandomDouble(double lowerBound, double upperBound, double* randNumber) = 0;

    virtual void getUniformRandomDouble(double lowerBound, double upperBound, std::vector<double> *randNumbers,
                                        std::size_t size) = 0;

    virtual void getNormalRandomInt(double mu, double sigma, int* randNumber) = 0;

    virtual void getNormalRandomInt(double mu, double sigma, std::vector<int> *randNumbers, std::size_t size) = 0;

    virtual void getNormalRandomDouble(double mu, double sigma, double* randNumber) = 0;

    virtual void getNormalRandomDouble(double mu, double sigma, std::vector<double> *randNumbers, std::size_t size) = 0;
};


#endif

2 个答案:

答案 0 :(得分:1)

RandomGeneratorNAG::RandomGeneratorNAG():RandomGeneratorNAG()
{
}

是错误的。 :RandomGeneratorNAG()位不正确。该语法用于调用另一个构造函数。在您的情况下,它是您要委派的同一构造函数。这将导致无限循环。也许这是一个错字。从代码中删除该部分并使用:

RandomGeneratorNAG::RandomGeneratorNAG()
{
}

如果要使用种子值为0的其他构造函数,请使用:

RandomGeneratorNAG::RandomGeneratorNAG() : RandomGeneratorNAG(0)
{
}

您可以在https://en.cppreference.com/w/cpp/language/initializer_list#Delegating_constructorhttp://www.stroustrup.com/C++11FAQ.html#delegating-ctor上了解有关委派构造函数的更多信息。

更新,以回应OP的评论

RandomGeneratorNAG::RandomGeneratorNAG()
{
}

等同于

// The default constructor of the base class is called.
RandomGeneratorNAG::RandomGeneratorNAG() : RandomGenerator() 
{
}

由于基类没有默认的构造函数,因此编译器在该行中报告错误。

您可以通过以下方式解决问题:

  1. 向基类添加默认构造函数,或者
  2. 删除派生类中的默认构造函数,或者
  3. 更改派生类的默认构造函数的实现。

    RandomGeneratorNAG::RandomGeneratorNAG() : RandomGenerator(0) 
    {
    }
    

答案 1 :(得分:0)

您的默认构造函数在成员初始化列表中调用自身,这将导致无限循环(假设编译器允许这样做,显然不是这种情况):

RandomGeneratorNAG::RandomGeneratorNAG() : RandomGeneratorNAG() {}
//                                       ^^^^^^^^^ Doesn't work

如果您的默认ctor根本不需要执行任何初始化,只需通过删除初始化即可解决

RandomGeneratorNAG::RandomGeneratorNAG() {}