Pregunta

Tengo un misterio en mis manos. Estoy tratando de aprender C ++ administrado viniendo de un fondo # C y se han topado con un obstáculo. Si tengo un proyecto que incluye dos clases, una clase base sopa y una clase derivada sopa de tomate , que compilo como una biblioteca estática (lib), Puedo obtener fichas sin resolver en los métodos virtuales en sopa . Aquí está el código:


Abstracts.proj

Soup.h

namespace Abstracts
{
    public ref class Soup abstract
    {
    public:
        virtual void heat(int Degrees);
    };
}

TomatoSoup.h

#include "Soup.h"

namespace Abstracts
{
    public ref class TomatoSoup : Abstracts::Soup
    {
    public:
        virtual void heat(int Degrees) override;
    };
}

TomatoSoup.cpp

#include "TomatoSoup.h"

void Abstracts::TomatoSoup::heat(int Degrees)
{
    System::Console::WriteLine("Soup's on.");
}

Main.proj

Main.cpp

#include "TomatoSoup.h"

using namespace System;

int main(array<System::String ^> ^args)
{
    Abstracts::TomatoSoup^ ts = gcnew Abstracts::TomatoSoup();

    return 0;
}

Me sale este error de tiempo de enlace en Main.proj

1>Main.obj : error LNK2020: unresolved token (06000001) Abstracts.Soup::heat
  1. He tratado de establecer

    virtual void heat(int Degrees)=0;
    
  2. He intentado implementar calor en la clase base

    virtual void heat(int Degrees){} 
    

    y obtener una formal, sin referencias advertencia parámetro tratada como una de error.

  3. He intentado tanto 1 y 2 con y sin la palabra clave abstracta sobre la la clase de sopa

Este problema me está volviendo loco y espero que para evitar que la conducción de otros frutos secos desarrolladores en el futuro.

ACTUALIZACIÓN: Este trabajó con el método comentando argumento de nombre de Greg Hewgill cuando la sopa de tomate :: calor se implementó en el archivo de cabecera, pero el error regresó cuando me mudé a la implementación TomatoSoup.cpp. He modificado la pregunta para reflejar eso.

¿Fue útil?

Solución

El error que está recibiendo (LNK2020) significa que el enlazador no puede encontrar una definición para la función Abstracts.Soup::heat en cualquier lugar. Cuando se declara la función como virtual void heat(int Degrees); el enlazador se espera encontrar el cuerpo de la función definida en alguna parte.

Si no va a suministrar un cuerpo de función, y requiere que las subclases finalmente anular la función, que debe hacer como usted ha indicado en la solución 1:

virtual void heat(int Degrees) = 0;

Esto le dice al compilador que no se va a implementar la función. ¿Qué pasa cuando se hace eso?

Además, con referencia a la segunda solución:

virtual void heat(int Degrees) {}

el compilador le está diciendo que no se hace referencia al parámetro de grados dentro de la función. Una forma de evitar esta advertencia en C ++ es no dar el parámetro un nombre:

virtual void heat(int /*Degrees*/) {}

El suministro de una implementación vacía es un poco diferente de una declaración virtual pura (= 0), sin embargo.

Otros consejos

Creo que este error puede haber ocurrido porque yo estaba tratando de construir Abstracts.proj como una biblioteca estática. Cuando cambié a un .DLL, todo funcionaba bien.

he visto mención de código administrado no está soportado desde bibliotecas estáticas, pero nada oficial. ¿Alguien tiene una buena referencia que indica esto?

No tengo mucha experiencia CLI pero creo que debería estar heredando el uso público:

ref pública clase sopa de tomate: público Resúmenes :: sopa

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top