2 Stimmen

Was mache ich falsch?, Verknüpfung in C++

Ich versuche, einen einfachen base64-Encoder/Decoder zu programmieren (um meine Programmierkenntnisse zu testen).

Ich kann es kompilieren, aber es lässt sich nicht verknüpfen, ich habe diese Fehlermeldung:

C:\Documents und Einstellungen \Facon\Escritorio >g++ base64.o main.o -o prueba.exe

main.o:main.cpp:(.text+0x24a): undefinierte Referenz auf `Base64Encode(std::vector > const&)'

collect2: ld gab 1 Exit-Status zurück

Compiler & Linker: Mingw32 3.4.5 SO: Windows XP

Dies ist mein Quellcode:

base64.h:

#ifndef BASE64_H
#define BASE64_H

#include <iostream>
#include <vector>

typedef unsigned char byte;

std::string Base64Encode(const std::vector<byte> &array);
std::vector<byte> Base64Decode(const std::string &array);

#endif

base64.cpp:

#include "base64.h"

std::string Base64Encode(std::vector<byte> &array)
{
 const char *base64_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 const unsigned int size = array.size();
 std::string output;

 for (unsigned int i = 0; (i < size); i++)
 {
  if ((size - i) > 3)
  { 
   output.push_back(static_cast<char>(base64_table[array[i] >> 2]));
   output.push_back(static_cast<char>(base64_table[((array[i++] & 0x03) << 4) | ((array[i] & 0xF0) >> 4)]));
   output.push_back(static_cast<char>(base64_table[((array[i++] & 0x0F) << 2) | ((array[i] & 0xC0) >> 4)]));
   output.push_back(static_cast<char>(base64_table[array[i] & 0x3F]));
  }
  else if ((size - i) == 3)
  {
   output.push_back(static_cast<char>(base64_table[array[i] >> 2]));
   output.push_back(static_cast<char>(base64_table[((array[i++] & 0x03) << 4) | ((array[i] & 0xF0) >> 4)]));
   output.push_back(static_cast<char>(base64_table[(array[i] & 0x0F) << 2]));
   output.push_back(static_cast<char>('='));
  }
  else if ((size - i) == 2)
  {
   output.push_back(static_cast<char>(base64_table[array[i] >> 2]));
   output.push_back(static_cast<char>(base64_table[(array[i] & 0x03) << 4]));
   output.push_back('=');
   output.push_back('=');
  }
 }

 return output;
}

std::vector<byte> Base64Decode(const std::string &array) // TODO
{
 const char *base64_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
}

main.cpp:

#include <iostream>
#include <vector>
#include "base64.h"

using namespace std;

int main(int argc, char *argv[])
{
 const char* prueba = "sure.";
 vector<byte> texto;
 string codificado;

 for (unsigned int i = 0; (prueba[i] != 0); i++)
 {
  texto.push_back(prueba[i]);
 }

 codificado = Base64Encode(texto);

 cout << codificado;

 return 0;
}

PD: Entschuldigung für meine schlechten Englischkenntnisse :P

4voto

Motti Punkte 104854

Sie verpassen eine const bei der Durchführung von Base64Encode wird es deklariert als:

std::string Base64Encode(const std::vector<byte> &array);

Aber umgesetzt als

std::string Base64Encode(std::vector<byte> &array) { ... }

Der Compiler geht davon aus, dass Sie die Funktion überladen haben (für const- und non-const-Vektoren) und dass die Implementierung der const-Version fehlt.

2voto

Mark Rushakoff Punkte 236626

Ihr Header deklariert Base64Encode so, dass es den Typ const std::vector<byte> &array während Ihre Quelldatei deklariert, dass sie den Typ std::vector<byte> &array -- Beachten Sie das Fehlen const Qualifikant.

Während also base64.cpp korrekt kompiliert, wird er nicht mit der Deklaration in der Kopfzeile verknüpft, die der einzige Prototyp ist, der main.cpp bekannt ist. Wenn der Linker läuft, main sucht nach der Signatur mit der const aber es ist nirgends zu finden.

1voto

JSBձոգչ Punkte 39615

Das Argument gegen Base64Encode wird deklariert als const im Header, aber non-const in der .cpp-Datei.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X