Arhn - архитектура программирования

Что я делаю не так на этом уроке?

У меня возникла проблема при связывании файлов .cpp и .h.

Вот мой код:

цена за тысячу показов

#include "Number.h"
#include <string.h>

Number::Number(const char* value, int baza)
{
    val = new char[strlen(value)+1];
    memcpy(val, value, strlen(value) + 1);
    this->base = baza;
}

Number::Number(char* value, int baza)
{
    val = new char[strlen(value) + 1];
    memcpy(val, value, strlen(value) + 1);
    this->base = baza;
}

Number::~Number()
{
    delete val;
    val = nullptr;
}

Number operator+(Number& i1, Number& i2)
{
    int x = char_to_10(i1.getVal(), i1.GetBase()) + char_to_10(i2.getVal(), i2.GetBase());
    cout << x<<endl;
    int baza_mare = (i1.GetBase() > i2.GetBase() ? i1.GetBase() : i2.GetBase());
    char* p = new char[10];
    p=SchimbaBaza(x, baza_mare);
    Number res(p, baza_mare);
    return res;
}

char* SchimbaBaza(int n, int newBase)
{
    int i = 0; int p = 0; int v[1000];
    while (n)
    {
        v[i] = n % newBase;
        i++;
        p++;
        n = n / newBase;
    }
    int j = 0;
    char* aux = new char[p];
    for (i = 0; i <= p; i++)
        aux[i] = NULL;
    for (i = p-1; i >= 0; i--)
    {
        if (v[i] <= 9)
            aux[j++] = (char)(v[i] + 48);
        else if (v[i] == 10)
            aux[j++] = 'A';
        else if (v[i] == 11)
            aux[j++] = 'B';
        else if (v[i] == 12)
            aux[j++] = 'C';
        else if (v[i] == 13)
            aux[j++] = 'D';
        else if (v[i] == 14)
            aux[j++] = 'E';
        else if (v[i] == 15)
            aux[j++] = 'F';
    }
    return aux;
}

void Number::SwitchBase(int newBase)
{
    int i = 0; int p = 0; int v[1000];
    char aux[100];
    int n = char_to_10(getVal(), GetBase());
    while (n)
    {
        v[i] = n % newBase;
        i++;
        p++;
        n = n / newBase;
    }
    int j = 0;
    for (i = p; i >= 0; i--)
    {
        if (v[i] <= 9)
            aux[j++]= (char)(v[i]+48);
        else if (v[i] == 10)
            aux[j++]= 'A';
        else if (v[i] == 11)
            aux[j++] = 'B';
        else if (v[i] == 12)
            aux[j++] = 'C';
        else if (v[i] == 13)
            aux[j++] = 'D';
        else if (v[i] == 14)
            aux[j++] = 'E';
        else if (v[i] == 15)
            aux[j++] = 'F';
    }

    this->base = newBase;
    j = 0;
    for (j = 1; j <=p; j++)
        cout<<aux[j];
    cout << endl;
    for (j = 0; j <p; j++)
        val[j] = NULL;
    for (j = 0; j < p; j++)
        val[j] = aux[j+1];
}

char* Number::getVal()
{
    return (this->val);
}

int Number::GetDigitsCount()
{
    return (strlen(this->val));
}

int Number::GetBase()
{
    return(this->base);
}

void Number::Print()
{
    printf("Numarul nostru in baza %d este %s.\n", this->base, this->val);
}

int char_to_10(const char* text, int baze)
{
    int x = 0;
    char * s = new char[strlen(text) + 1];
    memcpy(s, text, (strlen(text) + 1));
    for (int i = 0; i < strlen(s); i++)
    {
        if (s[i] >= '0' && s[i] <= '9')
            x = x + (s[i] - '0') * pow(baze, (strlen(s) - i - 1));
        if (s[i] == 'A')
            x = x + 10 * pow(baze, (strlen(s) - i - 1));
        if (s[i] == 'B')
            x = x + 11 * pow(baze, (strlen(s) - i - 1));
        if (s[i] == 'C')
            x = x + 12 * pow(baze, (strlen(s) - i - 1));
        if (s[i] == 'D')
            x = x + 13 * pow(baze, (strlen(s) - i - 1));
        if (s[i] == 'E')
            x = x + 14 * pow(baze, (strlen(s) - i - 1));
        if (s[i] == 'F')
            x = x + 15 * pow(baze, (strlen(s) - i - 1));
    }
    return x;
}

заголовок

#pragma once
#include <string.h>
#include <iostream>
using namespace std;

class Number
{
    char* val;
    int base;
public:
    Number(const char* value, int baza); // where base is between 2 and 16
    Number(char* value, int baza);
    ~Number();

    friend Number operator +(Number& i1, Number& i2);
    friend bool operator -(const Number& i1, const Number& i2);
    bool operator !();
    bool operator[](int index);
    bool operator>(const Number& i);
    Number(const Number& i);
    Number(const Number&& i);
    bool operator--();
    bool operator--(int value);

    void SwitchBase(int newBase);
    void Print();
    char* getVal();
    int  GetDigitsCount(); // returns the number of digits for the current number
    int  GetBase(); // returns the current base
};

int char_to_10(const char* text, int baze);
char* SchimbaBaza(int n, int newBase);

основной

#include <iostream>
#include "Number.h"
using namespace std;

int main()
{
    Number n1("14A", 12);
    printf("Avem numarul de %d cifre in baza %d.\n", n1.GetDigitsCount(), n1.GetBase());
    n1.Print();
    //n1.~Number();
    //n1.SwitchBase(10);
    //n1.Print();
    printf("obiectul nostru are valoarea %s\n",n1.getVal());
    //n1.SwitchBase(10);
    //cout << char_to_10(n1.getVal(), n1.GetBase());
    //cout << endl;
    //n1.SwitchBase(10);
    //printf("obiectul nostru are valoarea %s\n", n1.getVal());
    Number n2("19A", 13);
    Number n3 = n1 + n2;    
}

Ошибка, которую я получаю:

Неразрешенный внешний символ LNK2019 "public: __thiscall Number::Number(номер класса const &&)" (??0Number@@QAE@$$QBV0@@Z), на который ссылается функция "номер класса __cdecl operator+(номер класса &,номер класса & )" (??H@YA?AVNumber@@AAV0@0@Z)

13.05.2020

  • Вы связали результат main и Number вместе в окончательный исполняемый файл? 13.05.2020
  • @tadman да, остальные функции работают нормально. Моя проблема связана с оператором +. 13.05.2020
  • В качестве примечания: при публикации здесь постарайтесь обрезать все, что не имеет прямого отношения к рассматриваемой проблеме. Здесь много кода, который не имеет ничего общего с этой проблемой. 13.05.2020
  • Ваш Number(Number const &&) выглядит совсем не так. Должно быть Number(Number&&);, а вы его не реализовали. 13.05.2020
  • Итак, где вы определили Number(const Number&&)? Я не вижу этого в вашем коде. 13.05.2020
  • @TedLyngmo это верно, я еще не добрался туда, но я думал, что мне это не нужно для моего оператора+ 13.05.2020
  • Также странно, что ваш operator- имеет const аргументов, а ваш operator+ — нет. Также пришло время использовать std::string вместо new char[...]. 13.05.2020
  • using namespace std; вообще ужасная идея. В шапке хуже. 13.05.2020
  • Вы тоже не реализовали конструктор копирования? Если бы вы имели, он бы выбрал это вместо этого. 13.05.2020
  • operator-() возвращает логическое значение, а operator+() возвращает число. Почему разница? 13.05.2020
  • @TedLyngmo, не могли бы вы сказать мне, почему конструкторы копирования/перемещения изменили поведение моего оператора +? Я смущен 13.05.2020
  • @sweenish Я использую пространство имен std только для быстрого cin / cout во время тестирования, но я также могу удалить его, когда закончу. что касается оператора -, я его еще не реализовал. я застрял на + один 13.05.2020
  • @ Bianca0745 Это плохая причина для плохой практики. Две строки: using std::cin; и using std::cout; решают эту проблему. 13.05.2020
  • @sweenish, я знаю, но скажи это и нашим школьным учителям, лол. однако я почти уверен, что это не то, что вызывает мою проблему со ссылками здесь. 13.05.2020
  • n1 + n2 в Number n3 = n1 + n2; создает временный файл. Это можно переместить или скопировать в n3 при построении n3, поэтому вам нужен конструктор копирования и/или конструктор перемещения. Еще одно замечание: если вы сделаете сигнатуру operator+ такой: Number operator+(Number i1, const Number& i2);, вы можете сделать return i1 += i2; в функции - если вы начнете с реализации operator+=, что обычно является хорошим первым шагом. 13.05.2020
  • При поиске ошибок вы хотите сделать тестируемый код как можно меньше. В первую очередь следует отказаться от таких вещей, как using namespace std;, которые, как известно, являются рискованной практикой. 13.05.2020
  • Удобное чтение: Каковы основные правила и идиомы для оператора перегрузка? Много мудрости заключено в этих вопросах и ответах. 13.05.2020
  • @TedLyngmo Понятно, спасибо! 13.05.2020
  • @user4581301 user4581301 Буду иметь в виду, спасибо! 13.05.2020
  • Еще одно замечание: если вы начнете с реализации Number& Number::operator+=(const Number&);operator-=), вам не нужно будет делать бесплатные функции operator+ и operator- друзьями, поскольку они будут просто вызывать функции-члены operator+= и operator-=. 13.05.2020

Ответы:


1

Нет определения для функций:

Number(const Number& i);
Number(const Number&& i);
13.05.2020
  • Как упоминалось в комментариях, Number(const Number&& i) тоже неверно. 13.05.2020
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..