Ongeldige nieuwe expressie van abstract klassetype

Ik schrijf momenteel een RayTracer voor een universitaire klasse.
Om scènes uit bestanden te laden, schreef ik een SDFLOLLER om SDF-bestanden te lezen en scènes daarvoor te maken.

Als ik nu de loader wil compileren, krijg ik de volgende foutmelding:

rc/sdf_loader.cpp: In member function 'void SDFloader::add_shape(std::istringstream&)':
src/sdf_loader.cpp:95:58: error: invalid new-expression of abstract class type 'box'
                                &scene_.materials[mat]));
                                                      ^

Ik heb geprobeerd een oplossing te vinden, maar mislukt.

De SDF_Loader-klasse ziet eruit als het volgende:

class SDFloader {
  public:
    SDFloader();
    ~SDFloader();
    Scene const& scene() const;
    void read(std::string file);
  private:
    void add_material(std::istringstream&);
    void add_shape(std::istringstream&);
    void add_light(std::istringstream&);
    void add_camera(std::istringstream&);
    void apply_transformation(std::istringstream&);
  private:
    Scene scene_;
};

In mijn implementatie van de SDF-loader schreef ik de methode lezen ():

void SDFloader::add_shape(std::istringstream& iss) {
    std::string name;
    iss >> name;
    if(name == "box") {
      double x1,y1,z1,x2,y2,z2;
      std::string mat;
      iss >> name >> x1 >> y1 >> z1 >> x2 >> y2 >> z2 >> mat;
      scene_.shapes.insert(new box(point(x1,y1,z1),
                                   point(x2,y2,z2),
                                   name,
                                   &scene_.materials[mat]));
    }

en voor elke andere vorm dezelfde oproepen.

Waar is het probleem in mijn code? Ik zie het echt niet

Ik gebruik g++-4.9 - std=c++0xom alles te compileren en te koppelen


Antwoord 1, Autoriteit 100%

Ongeldige nieuw-expressie van abstracte klassentype ‘Box’

Er is niets onduidelijk over het foutbericht. Uw klasse boxheeft ten minste één lid dat niet wordt geïmplementeerd, wat betekent dat het abstract is. Je kunt geen abstracte klasse instantiëren.

Als dit een bug is, bevestigt u uw boxklasse door het ontbrekende lid (s) te implementeren.

Als het is door het ontwerp, neem dan het ontbrekende lid (s) uit en gebruik de afgeleide klasse.


Antwoord 2, Autoriteit 27%

Voor anderen die hun hoofd krabben, kwam ik deze fout tegen, omdat ik innapropisch een van de argumenten had gekwalificeerd, een van de argumenten aan een methode in een basisklasse, dus de afgeleide klasse-ledenfuncties waren er niet overheen. Zorg er dus voor dat je iets als

niet hebt

class Base 
{
  public:
      virtual void foo(int a, const int b) = 0;
}
class D: public Base 
{
 public:
     void foo(int a, int b){};
}

Antwoord 3, Autoriteit 18%

Als u C++ 11 gebruikt, kunt u de specificator “Override” gebruiken en het geeft u een compiler-fout als uw niet correct een abstracte methode overschrijft. Je hebt waarschijnlijk een methode die niet exact overeenkomt met een abstracte methode in de basisklasse, dus je wordt niet daadwerkelijk omgedraaid.

http://en.cppreference.com/w/cpp/language/override


Antwoord 4, Autoriteit 5%

Een andere mogelijke oorzaak voor toekomstige googlers

Ik had dit probleem omdat een methode die ik probeerde te implementeren een std::unique_ptr<Queue>(myQueue)vereiste als parameter, maar de klasse Queueis abstract. Ik heb dat opgelost door een QueuePtr(myQueue)-constructor als volgt te gebruiken:

using QueuePtr = std::unique_ptr<Queue>;

en gebruikte dat in plaats daarvan in de parameterlijst. Dit lost het op omdat de initializer probeert een kopie van Queuete maken wanneer je een std::unique_ptrvan zijn type maakt, wat niet kan gebeuren.

Other episodes