c ++ 17 — отладка блокчейна C ++

Поэтому я недавно решил попробовать свои силы в C и C ++ после нескольких лет работы строго в веб-разработке, и я узнал много полезной информации, но я также узнал, насколько сложным и хитрым может быть этот язык. Я новичок в C ++ и понимаю, что я не самый умный программист, но все, о чем я прошу, это немного помочь в отладке этого небольшого блокчейн-проекта, над которым я работал. Мой код разделен на три файла (один основной и два других являются классом «блок»). Ниже приведен код, содержащийся в каждом файле, и ошибка, которую я получаю.

block.h

#ifndef BLOCK_H
#define BLOCK_H

#include <string>
#include <ctime>

using namespace std;

class Block {
public:
Block(string _data, const unsigned short int blockNum, string _prevHash);
string getHash();private:
unsigned short int blockNum;
string data;
string hash(string data, unsigned short int blockNum, string prevHash, time_t timestamp);
string prevHash;
time_t timestamp;
};

#endif

block.cpp

#include <string>
#include <ctime>
#include "sha512.h"#include "block.h"
Block::Block(string _data, unsigned short int _blockNum, string _prevHash) {
data = _data;
blockNum = _blockNum;
prevHash = _prevHash;
timestamp = time(NULL);
}

// Block::~Block() {}

string Block::hash(string data, unsigned short int blockNum, string prevHash, time_t timestamp) {
char *_timestamp = ctime(&timestamp);
string hashContents = data + to_string(blockNum) + prevHash + to_string(_timestamp);
return sha512(hashContents);
}

string Block::getHash() {
return hash(data, blockNum, prevHash, timestamp);
}

main.cpp

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

int main() {
Block testBlock("Some Data", 1, "Genesis");
cout << testBlock.getHash() << endl;
return 0;
}

Сообщение об ошибке

Undefined symbols for architecture x86_64:
"Block::getHash()", referenced from:
_main in main-f12e95.o
"Block::Block(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, unsigned short, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)", referenced from:
_main in main-f12e95.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

-4

Решение

Ваши ошибки являются чем-то вроде побочного шоу, вызванного string *prevHash;

Вы почти никогда не хотите указатель на stringи это не похоже на один из таких случаев.

Указатель должен указывать на что-то полезное. Срок службы этого объекта должен превышать потребность указателя в этом объекте или указатель будет болтаться, и использование его будет иметь неопределенные результаты.

Например, вы определенно не хотите *prevHash = _prevHash;

* в этом контексте разыменование указателя, получение значения, на которое указывает, и если prevHash еще не было указано какое-то хранилище, результаты не определены. Инструкция выше говорит программе, чтобы получить значение, на которое указано (а его нет), и скопировать _prevHash внутрь.

Это не совсем попытка скопировать что-либо в ничто, это попытка скопировать что-то в какое-то неопределенное место в памяти, и это приведет к чему-то неопределенному. Действительно плохая сцена, которую компилятор допустит, потому что она семантически верна.

Решение: не надо этого.

string *prevHash;

должно быть

string prevHash;

Обратитесь к справочникам по программированию на C ++, чтобы лучше обсудить владение ресурсами, прежде чем начать работу с указателями. Если у вас нет справочных материалов, вы обречены на очень грубый переход на C ++. Тот, который граничит с невозможным. Если у вас есть ссылки, и ни одна из них не касается владения ресурсами, вы стали жертвой мошенничества. Вы не можете писать нетривиальные программы на C ++ без понимания принадлежности.

Правильная реализация Blockchain настолько же нетривиальна, насколько это возможно, и вы почти наверняка будете совершенно <Expletive удалено> ed, если вы не получили твердого понимания C ++, прежде чем пытаться его.

Заметки:

(string)blockNum не превратит число в string, Это актерский стиль. Он говорит, можете ли вы неявно преобразовать число в string или нет (и вы не можете), относитесь к числу, как если бы оно было string и игнорировать все проверки безопасности, потому что я Бог, и я знаю, что я делаю. С помощью броска в стиле c вы можете втиснуть квадратный колышек в круглое отверстие. Программа не будет работать правильно, но это на вас, как только вы начнете использовать приведение, чтобы лгать компилятору.

Смотрите на все броски с мерой недоверия. Обычно они означают, что вы нарушаете правила. Посмотрите на актерский состав в стиле с-почти наверняка как на ошибку. Прочтите о различных типах приведений в справочнике по программированию на C ++ и поймите их и их последствия, прежде чем их использовать. Всегда начинайте с наиболее ограничивающего состава и работайте в направлении менее ограничительного только тогда, когда это необходимо, и даже тогда, только когда убедитесь, что ваш замысел и намерение верны.

Используйте различные to_string функции превратить число в строку. Использовать stoX функции сделать обратное.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector