Błąd przy kompilacji. Błąd error LNK2001.

0

Jestem dopiero nowicjuszem w kwestii programowania(dopiero zacząłem uczyć się klas), jednakże mam problem z kompilacją kodu z powodu błędu: error LNK2001: unresolved external symbol "class ksiazka * ksiazki" (?ksiazki@@3PAVksiazka@@A). Podzieliłem swój program na 5 plików:

main.cpp

 
#include <iostream>
#include <conio.h>
#include <string>

#include "klasa.h"
#include "main.h"

void main()
{
	ksiazka ksiazki[20];
	
	for(;;)
	{
		int Wybor;
	system("cls");
	std::cout << "Menu:" << std::endl;
	std::cout << "-------------------------------------" <<  std::endl;
	std::cout << "1. Dodaj ksiazke do bazy danych" << std::endl; 
	std::cout << "2. Czytaj ksiazkę z bazy danych" << std::endl;
	std::cout << "3. Wyswietl ksiazki, bedace w bazie danych" << std::endl;
	std::cout << "0. Wyjscie" << std::endl;

	switch(Wybor)
	{
		case 1 : Dodawanie(); break;
		case 2 : Czytanie(); break;
		case 3 : PokazBaze(); break;
		case 0 : break; break;
		
		default:
		{
			std::cout << "Nieznana opcja!" << std::endl;
		}
	}
	}
	_getch();
}

main.h

#include<string>
#include "klasa.h"
struct wpisywanaksiazka
{
	std::string tytul;
	std::string autor;
	std::string ISBN;
	int iloscstron;
	int iloscwersow;
};

extern ksiazka ksiazki[20];

bool Dodawanie();
bool Czytanie();
bool PokazBaze();
 

funkcje.cpp

 
#include <iostream>
#include <conio.h>
#include <string>
#include "main.h"
#include "klasa.h"

bool Dodawanie()
{
	system("cls");
	wpisywanaksiazka wpisana;
	std::cout << "Podaj tytuł książki: ";
	std::cin >> wpisana.tytul;
	std::cout << std::endl;

	std::cout << "Podaj autora książki: ";
	std::cin >> wpisana.autor;
	std::cout << std::endl;
	
	std::cout << "Podaj ISBN książki: ";
	std::cin >> wpisana.ISBN;
	std::cout << std::endl;

	std::cout << "Podaj ilosc stron książki: ";
	std::cin >> wpisana.iloscstron;
	std::cout << std::endl;

	std::cout << "Podaj ilos wersow na stronie: ";
	std::cin >> wpisana.iloscwersow;
	std::cout << std::endl;

	for(int i = 0; i < 20; i++)
	{
		if(ksiazki[i].tytul.length() == 0)
		{
			ksiazki[i].tytul = wpisana.tytul; 
			ksiazki[i].autor = wpisana.autor; 
			ksiazki[i].ISBN = wpisana.ISBN; 
			ksiazki[i].iloscstron = wpisana.iloscstron; 
			ksiazki[i].iloscwersow = wpisana.iloscwersow; 
			std::cout << "Wpisanie do bazy danych powiodło sie. Numer w bazie danych to:" << (i+1) << std::endl;
			_getch();
			return true;
		}
		else
			{
				if( i == 19)
				{
					std::cout << "Brak miejsca w bazie danych. Nie mozna wpisac ksiazki." << std::endl;
					return false;
				}
			
			}
	}
}

bool PokazBaze()
{
	system("cls");
	std::cout << "Lp. Tytul Autor ISBN" << std::endl;
	for (int i = 0; i <  20; i++)
	{
		std::cout << (i+1) << ". " << ksiazki[i].tytul << " " << ksiazki[i].autor << " " << ksiazki[i].ISBN << std::endl;
	}
	_getch();
	return true;
}

bool Czytanie()
{
	return true;
}

klasa.h

#include<string>
#pragma once

class ksiazka
{
public:
	std::string tytul;
	std::string autor;
	std::string ISBN;
	unsigned iloscstron;
	unsigned iloscwersow;
	unsigned obecnastrona;
	unsigned obecnywers;

	
public:
	std::string pokaztytul();
	std::string pokazautora();
	std::string pokazISBN();
	int nastepnastrona();
	int nastepnywers();
	int przejsciedostr();
	ksiazka();
};

extern ksiazka ksiazki[20];


 

klasa.cpp

 
#include <string>
#include <iostream>
#include <conio.h>

#include "klasa.h"
#include "main.h"

std::string ksiazka::pokaztytul()
{
	return tytul;
}

std::string ksiazka::pokazautora()
{
	return autor;
}

std::string ksiazka::pokazISBN()
{
	return ISBN;
}

int ksiazka::nastepnastrona()
{
	if (obecnastrona == iloscstron)
	{
		std::cout << "To jest ostatnia strona nie mozna przejsc dalej." << std::endl;
	}

	else
	{
		obecnastrona++;
	}
	return 0;
}

int ksiazka::nastepnywers()
{
	if (obecnywers == iloscwersow)
	{
		obecnastrona++;
	}

	else
	{
		obecnywers++;
	}
	return 0;
}

int ksiazka::przejsciedostr()
{
	int strona = 4;
	for(;;)
	{

	if(strona > 0 && strona < iloscstron)
	{
		obecnastrona = strona;
		break;
	}
	else
	{
		std::cout << "To nie jest poprawny numer strony. Podaj prawidlowy numer strony."<<std::endl;
	}
	}
	return 0;
}

ksiazka::ksiazka()
{
	obecnastrona = 1;
	obecnywers = 1;

}

Nie wiem w czym tkwi problem, więć byłbym kontent jeśli ktoś by mi pomógł.

0

Do pliku cpp dodaj:
ksiazka ksiazki[20];
Lepiej nie używać zmiennych globalnych - kod jest źle napisany.

0

Czy mógłbyś napisać do którego dokładnie pliku i w którym miejscu mam dopisać podana frazę? I jakie błędy jeszcze popełniłem przy pisaniu kodu?

0

Czy mógłbyś napisać do którego dokładnie pliku i w którym miejscu mam dopisać podana frazę?

Lepiej nie używać zmiennych globalnych - kod jest źle napisany.

Najlepiej nigdzie.

Tablicę deklaruj lokalnie i przekazuj w argumentach.

2

zadnych tablic!

uzyj std::vector

0

@fasadin
Użyłem tablicy, bo nie wiedziałem jak zrobić ją zrobić samorozszerzalną.

0

"Użyłem tablicy, bo nie wiedziałem jak zrobić ją zrobić samorozszerzalną."

bo ona nie jest samorozszerzalna. To zdanie jakos nie ma za duzo sensu. Zapoznaj sie z std::vector

0

Chodziło mi o to, że wiem że ta tablica jest zdefiniowana jako o stałej ilości obiektów. Jednakże gdybym umiał to zrobiłbym tą tablicę, jako taką, która w zależności od tego ile książek jest dodanych taką wielkość ma.

2

ostatni raz napisze, uzyj std::vector.

Jezeli bardzo chcesz na tablicy to musisz napisac... swoj wlasny std::vector. Czyli musisz napisac klase ktora bedzie pamietala ile obiektow zostalo dodane do tablicy i jak duza tablica jest. Gdy bedzie potrzeba dodac kolejny obiekt do tablicy i sie do niej nie zmiesci, to musisz przepisac wszystkie obiekty do wiekszej tablicy i zwolnic pamiec starej tablicy

0

Ok dobra dzięki za wszelką pomoc i twój czas.

0

Przykład użycia dla leniwych:

#include <iostream>
#include <vector>
#include <string>

struct Foo
{
	std::string m_title;
	Foo(const std::string& title)
		:
		m_title(title)
	{}
};

auto main() -> int
{
	std::vector<Foo> vec;
	vec.push_back(Foo("Janko muzykant"));
	vec.push_back(Foo("Na jagody"));

	for (auto const& item : vec)
	{
		std::cout << item.m_title << '\n';
	}
} 
2

Ps. Spróbuj czegoś w tym stylu

digit.hpp:

#pragma once
#include <cassert>
#include <iostream>

class digit {
    unsigned value;
public:
    digit(unsigned value = 0): value(value) {
        assert(value >= 0 && value <= 9);
    }
    
    operator unsigned() const {
        return value;
    }
    
    friend std::ostream &operator<<(std::ostream &os, digit d) {
        return os << d.value;
    }
    
    friend std::istream &operator>>(std::istream &is, digit &d) {
        return is >> d.value;
    }
};

bool.hpp:

#pragma once
#include <string>
#include <array>
#include <vector>

#include "digit.hpp"

namespace schema {
    using isbn13 = std::array<digit, 13>;
    struct book {
        std::string title;
        std::string author;
        schema::isbn13 isbn13;
        size_t pages;
    };
}

namespace table {
    using books = std::vector<schema::book>;
}

db.hpp:

#pragma once

#include "book.hpp"

struct database {
    table::books books;
};

main.cpp:

#include <iostream>

#include "db.hpp"

using id = size_t;

id insert(database &db, schema::book const &book) {
    db.books.push_back(book);
    return db.books.size()-1;
}

namespace view {
    namespace all {
        void books(database const &db, std::ostream &out = std::cout) {
            for(auto const &book: db.books) {
                out << "title: " << book.title << "\n"
                    << "author: " << book.author << "\n"
                    << "isbn13: ";
                for(auto const &dig: book.isbn13) {
                    out << dig;
                }
                out << "\n"
                    << "pages: " << book.pages << "\n";
            }
        }
    }
    
    namespace input {
        schema::book book(std::istream &in = std::cin) {
            std::string author, title;
            schema::isbn13 isbn13;
            size_t pages;
            
            in >> author >> title;
            for(auto &dig: isbn13) 
                in >> dig;
            in >> pages;
            
            return schema::book {
                author, title,
                isbn13, pages
            };
        }
    }
}

int main() {
    using namespace view;
    
    database db = {
        table::books {
            schema::book {
                "harry potter philosopher's stone",
                "J. K. Rowling",
                {{ 9, 7, 8, 0, 4, 3, 9, 7, 0, 8, 1, 8, 0 }},
                309
            }
        }
    };
    
    view::all::books(db);
}

http://melpon.org/wandbox/permlink/L2p2hiaybEVVcnvF

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.