problem med klassbyggnad (c++)

Trädvy Permalänk
Medlem
Plats
Karlskrona
Registrerad
Feb 2012

problem med klassbyggnad (c++)

Edit: Dalton Sleeper lyckades hitta felet åt mig.
Hade missat

#include "lumber.h"

i cpp filen, hade fått för mig att det räckte att en annan cpp fil inkluderade lumber.h.

Håller på att bygga ihop ett program i hemuppgift som ska hantera information om ett byggföretags trävaror.
Vi ska ha en huvudklass och två arvsklasser, har konstruerat själva arvsklasserna utan att ordna med arvsherakin etc.
Håller på med det som ska bli huvudklassen, nu är bekymret att jag hela tiden får felmeddelande men jag kan inte efter flera timmars väggbankande se vad som är fel i koden.
Lumber.h inkluderas ifrån en annan cpp fil i systemet och felmeddelandena jag får är
"Severity Code Description Project File Line
Error C2653 'Lumber': is not a class or namespace name 1B-Byggvarufirman c:\users\kristoffer\documents\visual studio 2015\projects\bth\objekt orienterad programmering i c++\1b-byggvarufirman\1b-byggvarufirman\lumber.cpp 3"
Alla tips och råd uppskattas, har även med koden ifrån lumber.cpp och lumber.h.

#pragma once #ifndef LUMBER_H #define LUMBER_H using namespace std; #include <string> class Lumber { private: int width, thickness; float price; public: Lumber(); Lumber(int width, int thickness, float price); ~Lumber(); void setWidth(int width); int getWidth() const; void setThickness(int thickness); int getThickness() const; void setPrice(float price); float getPrice() const; }; #endif

#include "woodpanel.h" #include "woodstud.h" using namespace std; Lumber::Lumber() { this->width = 0; this->thickness = 0; this->price = 0; } Lumber::Lumber(int width, int thickness, float price) { this->width = width; this->thickness = thickness; this->price = price; } Lumber::~Lumber() {} void Lumber::setWidth(int width) { this->width = width; } int Lumber::getWidth() const { return width; } void Lumber::setThickness(int thickness) { this->thickness = thickness; } int Lumber::getThickness() const { return thickness; } void Lumber::setPrice(float price) { this->price = price; } float Lumber::getPrice() const { return price; }

Microsoft är inte dumma.
De mer eller mindre tvingar på en ett dåligt operativsystem för att de sen ska kunna suga ut ännu mer pengar ifrån ens fickor genom att en "tekniker" ska kolla på problemet som de själva har skapat...

Trädvy Permalänk
Medlem
Plats
127.0.0.1
Registrerad
Sep 2003

Lumber.cpp inkluderar inte Lumber.h?
(kan vara bra att flytta ner using namespace std raden så den ligger under alla include)
(du ska inte heller behöva pragma om du kör define)

1: Intel i7-3930K | 32GB Corsair Dominator GT | Asus Rampage IV Extreme x79 | 2 x 1080 GameRock Premium 8GB | 2 x Samsung Pro 840 512GB | Corsair AX1200i | BenQ XL2411 24" / W1070 135" | Bose QC25 | Windows 10 Pro x64 | HTC Vive |
2: Intel Core i7-4700HQ | 32GB RAM | Intel HM87 Express | GTX 780M | 17" | Windows 10 x64 |

Trädvy Permalänk
Medlem
Plats
Karlskrona
Registrerad
Feb 2012

@Dalton Sleeper: "Lumber.h inkluderas ifrån en annan cpp fil i systemet"
Mainfile.cpp inkluderar warehoussystem.h (sparar till fil m.m.) som inkluderar lumber.h.
men tog bort pragma, standard grej som visual studio slänger in på alla h filer och jag sällan tänker på att radera.

Microsoft är inte dumma.
De mer eller mindre tvingar på en ett dåligt operativsystem för att de sen ska kunna suga ut ännu mer pengar ifrån ens fickor genom att en "tekniker" ska kolla på problemet som de själva har skapat...

Trädvy Permalänk
Medlem
Plats
127.0.0.1
Registrerad
Sep 2003
Skrivet av Skånsksnapphane:

@Dalton Sleeper: "Lumber.h inkluderas ifrån en annan cpp fil i systemet"
Mainfile.cpp inkluderar warehoussystem.h (sparar till fil m.m.) som inkluderar lumber.h.
men tog bort pragma, standard grej som visual studio slänger in på alla h filer och jag sällan tänker på att radera.

Jag förstår fortfarande inte hur Lumber.cpp får tillgång till Lumber.h. Det spelar ingen roll om en annan cpp inkluderar den, den måste inkluderas i Lumber.cpp eller i en header som inkluderas i Lumber.cpp. Om det ska fungera nu så måste Lumber.h inkluderas i någon av dina wood*.h, gör den det?

1: Intel i7-3930K | 32GB Corsair Dominator GT | Asus Rampage IV Extreme x79 | 2 x 1080 GameRock Premium 8GB | 2 x Samsung Pro 840 512GB | Corsair AX1200i | BenQ XL2411 24" / W1070 135" | Bose QC25 | Windows 10 Pro x64 | HTC Vive |
2: Intel Core i7-4700HQ | 32GB RAM | Intel HM87 Express | GTX 780M | 17" | Windows 10 x64 |

Trädvy Permalänk
Medlem
Plats
Karlskrona
Registrerad
Feb 2012

@Dalton Sleeper: Är det nu jag ska ställa mig vid skampålen?...
Vet inte vart jag fått det ifrån men trodde det räckte att "warehoussystem.cpp" hade

#include "lumber.h"

så länkades alla cpp och h filerna ihop.
Fixat till det nu och rullar på som det ska
Tackar så mycket för hjälpen

Microsoft är inte dumma.
De mer eller mindre tvingar på en ett dåligt operativsystem för att de sen ska kunna suga ut ännu mer pengar ifrån ens fickor genom att en "tekniker" ska kolla på problemet som de själva har skapat...

Trädvy Permalänk
Medlem
Plats
127.0.0.1
Registrerad
Sep 2003

Det kan va lite bökigt i början

1: Intel i7-3930K | 32GB Corsair Dominator GT | Asus Rampage IV Extreme x79 | 2 x 1080 GameRock Premium 8GB | 2 x Samsung Pro 840 512GB | Corsair AX1200i | BenQ XL2411 24" / W1070 135" | Bose QC25 | Windows 10 Pro x64 | HTC Vive |
2: Intel Core i7-4700HQ | 32GB RAM | Intel HM87 Express | GTX 780M | 17" | Windows 10 x64 |

Trädvy Permalänk
Medlem
Plats
Umeå
Registrerad
Mar 2013

För att förklara lite mer ingående på vad som gick fel här:

När man kompilerar ett projekt i C/C++ så kompileras varje .cpp-fil separat till varsin .o-fil (objektfil), sedan länkas dessa ihop av "länkaren" (linker) till en .exe/.dll eller liknande. Det är innan själva kompilerings-stadiet (i preprocessing-stadiet) som dessa #include-direktiv händer, och eftersom .cpp-filerna kompileras separat så känner inte filen lumber.cpp till vad warehouse.cpp har för includes/annat innehåll.

När det kommer till C och C++ så kan det vara väldigt bra att lära sig om hela kompilerings/länkningsprocessen, då förstår man mycket enklare sådana här problem. Kommer vara väldigt relevant även när det gäller att använda externa bibliotek (som man också måste #include'a och länka ihop med den resulterande .exe/.dll filen)

Så för en kort överblick så funkar det ungefär såhär:
1. Preprocessorn utvärderar alla #include och macros (som #ifndef osv) och genererar kod som kan kompileras av kompilatorn
2. Kompilatorn kompilerar denna kod till objekt-filer (1 per .cpp-fil)
3. Länkaren tar dessa objektfiler och länkar ihop dessa (tillsammans med externa bibliotek) till en resulterande binär fil (.exe, .dll, .so, .a, .lib osv)