<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Seltsamer Basisklassen Constructor aufruf]]></title><description><![CDATA[<p>Ich bekomme immer dieser Fehlermeldung wenn ich versuche den Raytracer zum kompilieren. Ich schreib ihn in einem Computer Grafik Praktikum. Es wäre echt lieb wenn ihr mir helfen könntet:</p>
<blockquote>
<p>~/cg/12/Shader.hxx||In constructor »EnvShader::EnvShader(Scene*, const Vec3f&amp;, const std::string&amp;, const std::string&amp;, const std::string&amp;, const std::string&amp;, const std::string&amp;, const std::string&amp;)«:|<br />
~/cg/12/Shader.hxx|26|Fehler: »Shader::Shader()« ist privat|<br />
~/cg/12/EnvShader.cxx|19|Fehler: in diesem Zusammenhang|<br />
||=== Build finished: 2 errors, 0 warnings ===|</p>
</blockquote>
<p>Die Basisklasse wird von vielen Shadern benutzt. Dieser ist der einzige der Rumzickt. Ich verstehe einfach nicht wo ich den leeren Konstruktor der Basisklasse aufrufen soll.</p>
<p>Auch bei testweise eingeführten EnvShader(int i) der gar nichts macht hat er rumgemeckert. Ich bin einfach mit meinem Latein am Ende.</p>
<p>Basisklasse:</p>
<pre><code class="language-cpp">#ifndef SHADER_HXX
#define SHADER_HXX

#include &quot;Vec3f.hxx&quot;
#include &quot;Ray.hxx&quot;

class Scene;

#define RecursionDepth 10

class Shader
{
public:
  Shader(Scene* scene);

  virtual ~Shader();

  virtual Vec3f Shade(Ray&amp; ray) = 0;
  virtual int getMagicNumber();
  Scene* getScene();
protected:
  Scene* m_scene;

private:
  Shader();
  Shader(const Shader&amp; );
  Shader&amp; operator=(const Shader&amp; );
};
#endif
</code></pre>
<p>Abgeleitete Klasse:</p>
<pre><code class="language-cpp">#ifndef ENVSHADER_HXX_INCLUDED
#define ENVSHADER_HXX_INCLUDED

#include &quot;Shader.hxx&quot;
#include &quot;Texture.hxx&quot;
#include &quot;Box.hxx&quot;
#include &lt;string&gt;

class EnvShader : public Shader
{
public:
          EnvShader(Scene* scene,
	      const Vec3f&amp; ambient_color,
	      const std::string&amp; left,
	      const std::string&amp; right,
	      const std::string&amp; front,
	      const std::string&amp; back,
	      const std::string&amp; up,
	      const std::string&amp; down);

  virtual ~EnvShader();

  virtual Vec3f Shade(Ray&amp; ray);

private:
  EnvShader();
  Vec3f m_ambient_color;
  Texture* m_left;
  Texture* m_right;
  Texture* m_front;
  Texture* m_back;
  Texture* m_up;
  Texture* m_down;
  Box m_box;
  Scene* m_scene;
};
#endif // ENVSHADER_HXX_INCLUDED
</code></pre>
<p>C++ Code der Abgeleiteten Klasse:</p>
<pre><code class="language-cpp">#include &quot;EnvShader.hxx&quot;
#include &quot;FlatShader.hxx&quot;
#include &quot;Primitive.hxx&quot;
#include &quot;Vec3f.hxx&quot;
#include &quot;Scene.hxx&quot;
#include &lt;math.h&gt;
#include &quot;InfinitePlane.hxx&quot;
#include &quot;TexturedSmoothTriangle.hxx&quot;

EnvShader::EnvShader(Scene* scene,
	      const Vec3f&amp; ambient_color,
	      const std::string&amp; left,
	      const std::string&amp; right,
	      const std::string&amp; front,
	      const std::string&amp; back,
	      const std::string&amp; up,
	      const std::string&amp; down) : m_ambient_color(ambient_color), m_scene(scene)
{
    std::cout &lt;&lt; &quot;ENV Shader constructor\n&quot;;
    m_left = new Texture(left);
    m_right = new Texture(right);
    m_front = new Texture(front);
    m_back = new Texture(back);
    m_up = new Texture(up);
    m_down = new Texture(down);
}

EnvShader::~EnvShader()
{
    delete(m_left);
    delete(m_right);
    delete(m_up);
    delete(m_down);
    delete(m_front);
    delete(m_back);

}

Vec3f
EnvShader::Shade(Ray&amp; ray)
{
 return(Vec3f(0,0,0)); // make it simple
}
</code></pre>
<p>Wäre echt super wenn ihr mir helfen könntet.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/233004/seltsamer-basisklassen-constructor-aufruf</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 03:11:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/233004.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 30 Jan 2009 03:08:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Seltsamer Basisklassen Constructor aufruf on Fri, 30 Jan 2009 03:09:33 GMT]]></title><description><![CDATA[<p>Ich bekomme immer dieser Fehlermeldung wenn ich versuche den Raytracer zum kompilieren. Ich schreib ihn in einem Computer Grafik Praktikum. Es wäre echt lieb wenn ihr mir helfen könntet:</p>
<blockquote>
<p>~/cg/12/Shader.hxx||In constructor »EnvShader::EnvShader(Scene*, const Vec3f&amp;, const std::string&amp;, const std::string&amp;, const std::string&amp;, const std::string&amp;, const std::string&amp;, const std::string&amp;)«:|<br />
~/cg/12/Shader.hxx|26|Fehler: »Shader::Shader()« ist privat|<br />
~/cg/12/EnvShader.cxx|19|Fehler: in diesem Zusammenhang|<br />
||=== Build finished: 2 errors, 0 warnings ===|</p>
</blockquote>
<p>Die Basisklasse wird von vielen Shadern benutzt. Dieser ist der einzige der Rumzickt. Ich verstehe einfach nicht wo ich den leeren Konstruktor der Basisklasse aufrufen soll.</p>
<p>Auch bei testweise eingeführten EnvShader(int i) der gar nichts macht hat er rumgemeckert. Ich bin einfach mit meinem Latein am Ende.</p>
<p>Basisklasse:</p>
<pre><code class="language-cpp">#ifndef SHADER_HXX
#define SHADER_HXX

#include &quot;Vec3f.hxx&quot;
#include &quot;Ray.hxx&quot;

class Scene;

#define RecursionDepth 10

class Shader
{
public:
  Shader(Scene* scene);

  virtual ~Shader();

  virtual Vec3f Shade(Ray&amp; ray) = 0;
  virtual int getMagicNumber();
  Scene* getScene();
protected:
  Scene* m_scene;

private:
  Shader();
  Shader(const Shader&amp; );
  Shader&amp; operator=(const Shader&amp; );
};
#endif
</code></pre>
<p>Abgeleitete Klasse:</p>
<pre><code class="language-cpp">#ifndef ENVSHADER_HXX_INCLUDED
#define ENVSHADER_HXX_INCLUDED

#include &quot;Shader.hxx&quot;
#include &quot;Texture.hxx&quot;
#include &quot;Box.hxx&quot;
#include &lt;string&gt;

class EnvShader : public Shader
{
public:
          EnvShader(Scene* scene,
	      const Vec3f&amp; ambient_color,
	      const std::string&amp; left,
	      const std::string&amp; right,
	      const std::string&amp; front,
	      const std::string&amp; back,
	      const std::string&amp; up,
	      const std::string&amp; down);

  virtual ~EnvShader();

  virtual Vec3f Shade(Ray&amp; ray);

private:
  EnvShader();
  Vec3f m_ambient_color;
  Texture* m_left;
  Texture* m_right;
  Texture* m_front;
  Texture* m_back;
  Texture* m_up;
  Texture* m_down;
  Box m_box;
  Scene* m_scene;
};
#endif // ENVSHADER_HXX_INCLUDED
</code></pre>
<p>C++ Code der Abgeleiteten Klasse:</p>
<pre><code class="language-cpp">#include &quot;EnvShader.hxx&quot;
#include &quot;FlatShader.hxx&quot;
#include &quot;Primitive.hxx&quot;
#include &quot;Vec3f.hxx&quot;
#include &quot;Scene.hxx&quot;
#include &lt;math.h&gt;
#include &quot;InfinitePlane.hxx&quot;
#include &quot;TexturedSmoothTriangle.hxx&quot;

EnvShader::EnvShader(Scene* scene,
	      const Vec3f&amp; ambient_color,
	      const std::string&amp; left,
	      const std::string&amp; right,
	      const std::string&amp; front,
	      const std::string&amp; back,
	      const std::string&amp; up,
	      const std::string&amp; down) : m_ambient_color(ambient_color), m_scene(scene)
{
    std::cout &lt;&lt; &quot;ENV Shader constructor\n&quot;;
    m_left = new Texture(left);
    m_right = new Texture(right);
    m_front = new Texture(front);
    m_back = new Texture(back);
    m_up = new Texture(up);
    m_down = new Texture(down);
}

EnvShader::~EnvShader()
{
    delete(m_left);
    delete(m_right);
    delete(m_up);
    delete(m_down);
    delete(m_front);
    delete(m_back);

}

Vec3f
EnvShader::Shade(Ray&amp; ray)
{
 return(Vec3f(0,0,0)); // make it simple
}
</code></pre>
<p>Wäre echt super wenn ihr mir helfen könntet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654747</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654747</guid><dc:creator><![CDATA[rohezal]]></dc:creator><pubDate>Fri, 30 Jan 2009 03:09:33 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsamer Basisklassen Constructor aufruf on Fri, 30 Jan 2009 07:04:21 GMT]]></title><description><![CDATA[<p>Die Fehlermeldung ist doch eindeutig: Da Du in EnvShader hier <strong>garkeinen</strong> Basisklassenkonstruktor aufrufst (wieso der Titel <strong>seltsam</strong>?), ruft der Compiler für Dich den ohne Parameter auf ( <code>Shader::Shader()</code> ). Und der ist privat.</p>
<p>Ruf in EnvShader den Konstruktor <code>Shader::Shader(Scene*)</code> auf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654776</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654776</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 30 Jan 2009 07:04:21 GMT</pubDate></item><item><title><![CDATA[Reply to Seltsamer Basisklassen Constructor aufruf on Fri, 30 Jan 2009 08:43:22 GMT]]></title><description><![CDATA[<p>Noch eine kleine Anmerkung: Unter C++ werden die Header der C- sowie der C++-Standardbibliothek ohne &quot;.h&quot; geschrieben. Header aus der C-Bibliothek bekommen ein &quot;c&quot; vorangestellt.</p>
<pre><code class="language-cpp">// Statt
#include &lt;math.h&gt;
// Verwendet man eigentlich (Nun im namespace std)
#include &lt;cmath&gt;
</code></pre>
<p>Weitere Anmerkung: Du solltest in deiner Klasse entweder einen privaten Kopierkonstruktor und Zuweisungsoperator deklarieren (ohne Implementation), oder diese explizit schreiben. Ansonsten wirst du noch recht früh feststellen, wie es ist wenn die Zeiger bereits gelöscht sind...</p>
<p>Falls du es nachvollziehen willst:</p>
<pre><code class="language-cpp">EnvShader shader(/* deine Parameter */);
{
    EnvShader shader2 = shader;
} // &lt;-- Hier sind die Zeiger in shader bereits gelöscht, da flache Kopie...
</code></pre>
<p>Dann lieber auf Kopie/Zuweisung verzichten, oder explizit schreiben. Ich würde erst einmal folgenden Code hinzufügen, dann meckert der Compiler wenn du irgendwo Kopie erzeugen willst, oder eine Zuweisung machst (Und kannst dann noch immer entscheiden ob du sie brauchst).</p>
<pre><code class="language-cpp">//... [Klasse EnvShader]
private:
    EnvShader(EnvShader const &amp;);
    EnvShader&amp; operator=(EnvShader const &amp;);
//...
</code></pre>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1654821</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1654821</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Fri, 30 Jan 2009 08:43:22 GMT</pubDate></item></channel></rss>