Jay Nguyen Posted September 7, 2013 Share Posted September 7, 2013 I need to create a DOB out of OCCCDate in the person header file and then call it in the testOCCCDate.cpp. but i dont know how please help me.. here is my UML; Person #firstname: String #lastName:String DOB :OCCCDate/// i having problem creating this DOB... some1 help me please OCCCDate.zip Link to comment https://www.neowin.net/forum/topic/1175399-c-help/ Share on other sites More sharing options...
0 Andre S. Veteran Posted September 7, 2013 Veteran Share Posted September 7, 2013 What is a DOB and an OCCCDate? What's the context? What's the problem? Put some work in your question so others don't have to do that work to figure out what you mean. Matthew_Thepc 1 Share Link to comment https://www.neowin.net/forum/topic/1175399-c-help/#findComment-595928557 Share on other sites More sharing options...
0 Jay Nguyen Posted September 7, 2013 Author Share Posted September 7, 2013 DOB is Date Of Birth. OCCCDate is a Header file that i created. Link to comment https://www.neowin.net/forum/topic/1175399-c-help/#findComment-595928885 Share on other sites More sharing options...
0 +Majesticmerc MVC Posted September 7, 2013 MVC Share Posted September 7, 2013 From what I understand, you want to add a date of birth into the Person class. Step 1 To begin, you'll need to add a date of birth field into the person class. You'll need to do this in two parts. First, you need to include the OCCCDate class header file inside your Person.h header file... Person.h --------------------------------------------------------- //Person.h #ifndef PERSON_H #define PERSON_H #include<string> // Add the OCCCDate.h header file... #include "OCCCDate.h" ... Once you've added the header file, you can create a private class member inside your person class like you've described in your original post. Person.h --------------------------------------------------------- ... class Person{ private: string firstname; string lastname; // Add an OCCCDate class here as a member, just like you did for the strings above. public: ... Step 2:It's unlikely that you'll want a person to have the current system date as their date of birth, so you'll need to add a parameter to the Person constructor to pass a date of birth. like this: Person.h --------------------------------------------------------- ... class Person{ private: ... public: Person(string firstName, string lastName, OCCCDate dateOfBirth); // ^--------,---------^ // New parameter in the constructor. ... Don't forget you'll need to copy the date of birth parameter in the constructor in your Person.cpp file too! Looking at your .cpp file, you're almost there already :)).Once you've done that, you can add a method to the Person class to retrieve the date of birth (just like Person::getFirstName() and Person::getLastName()), and you're good to go! Hope this helps :) Link to comment https://www.neowin.net/forum/topic/1175399-c-help/#findComment-595929151 Share on other sites More sharing options...
0 Jay Nguyen Posted September 7, 2013 Author Share Posted September 7, 2013 When i I use #include "OCCCDate.h" in the person file it gave me more error. OCCCDate.zip Link to comment https://www.neowin.net/forum/topic/1175399-c-help/#findComment-595929367 Share on other sites More sharing options...
0 Jay Nguyen Posted September 8, 2013 Author Share Posted September 8, 2013 bump? Link to comment https://www.neowin.net/forum/topic/1175399-c-help/#findComment-595930265 Share on other sites More sharing options...
0 +Majesticmerc MVC Posted September 8, 2013 MVC Share Posted September 8, 2013 I assume you're seeing an error talking about "redefinition of class OCCCDate"? That's because of the following lines in OCCCDate.h... //file OcccDate.h #ifndef OCCCDATE_H #define OCCCDDATE_H See the spelling mistake in the #define line (hint: two 'D's in DDATE)? You'll need to fix that like this... //file OcccDate.h #ifndef OCCCDATE_H #define OCCCDATE_H Once you fix that, it should work. Because of the spelling mistake, the #ifndef block was always TRUE (because OCCCDATE_H was never defined), and the compiler tried to define the class again, which is bad ;). Link to comment https://www.neowin.net/forum/topic/1175399-c-help/#findComment-595930801 Share on other sites More sharing options...
0 Andre S. Veteran Posted September 8, 2013 Veteran Share Posted September 8, 2013 Or you could just use #pragma once rather than #ifndef #define #endif. All major compilers (MSVC, GCC, Clang, Intel, etc.) support it and it reduces the potential for bugs. Like the one you just had. Link to comment https://www.neowin.net/forum/topic/1175399-c-help/#findComment-595930879 Share on other sites More sharing options...
0 Jay Nguyen Posted September 8, 2013 Author Share Posted September 8, 2013 WOW just that small mistake and it took me 3 days. jesus. programming is so hard. Link to comment https://www.neowin.net/forum/topic/1175399-c-help/#findComment-595931101 Share on other sites More sharing options...
0 +Majesticmerc MVC Posted September 8, 2013 MVC Share Posted September 8, 2013 Or you could just use #pragma once rather than #ifndef #define #endif. All major compilers (MSVC, GCC, Clang, Intel, etc.) support it and it reduces the potential for bugs. Like the one you just had. While I agree with you in practice, if it's an assignment it may be that the tutor is sticking strictly to the standard, and using #pragma vs a standard-compliant alternative may lose the student points. WOW just that small mistake and it took me 3 days. jesus. programming is so hard. Indeed it is, but its also incredibly gratifying if you enjoy it. Glad your issue is sorted. :) Link to comment https://www.neowin.net/forum/topic/1175399-c-help/#findComment-595931131 Share on other sites More sharing options...
0 Andre S. Veteran Posted September 9, 2013 Veteran Share Posted September 9, 2013 WOW just that small mistake and it took me 3 days. jesus. programming is so hard. No, C++ is just ****. No decent programming language uses header files and silly macro tricks just to get programs to compile. Don't let your opinion of programming be tainted by the arcane and irrelevant rules of C++, even though it happens that this is what your teacher misleadingly thought would be a good idea to show you first. If your teacher thinks C++ is good just ask him "why are there header files in C++?" and watch him be embarassed. I fondly remember being unable to receive an intelligent answer to this question in my first programming class. It ****es me off to think many people must quit programming simply because they're being shown the most bizarre and capricious language in existence first, and assume that all programming must be like that. It's not. Arm yourself with courage and a good C++ book (I used The C++ Primer Plus by Stephen Prata), and when you're through with this course, take a look at such beautiful languages as Python, C#, F#, Scala, Rust, etc. I guarantee your outlook on programming will change for the better and dramatically so. Vykranth 1 Share Link to comment https://www.neowin.net/forum/topic/1175399-c-help/#findComment-595931753 Share on other sites More sharing options...
0 FloatingFatMan Posted September 9, 2013 Share Posted September 9, 2013 No, C++ is just ****. No decent programming language uses header files and silly macro tricks just to get programs to compile. Don't let your opinion of programming be tainted by the arcane and irrelevant rules of C++, even though it happens that this is what your teacher misleadingly thought would be a good idea to show you first. If your teacher thinks C++ is good just ask him "why are there header files in C++?" and watch him be embarassed. I fondly remember being unable to receive an intelligent answer to this question in my first programming class. It ****es me off to think many people must quit programming simply because they're being shown the most bizarre and capricious language in existence first, and assume that all programming must be like that. It's not. That said, he didn't exactly help himself with that function name. VERY easy to mistype that, so I'm not at all surprised he didn't spot it... Link to comment https://www.neowin.net/forum/topic/1175399-c-help/#findComment-595931945 Share on other sites More sharing options...
0 Andre S. Veteran Posted September 9, 2013 Veteran Share Posted September 9, 2013 That said, he didn't exactly help himself with that function name. VERY easy to mistype that, so I'm not at all surprised he didn't spot it... At least when you mistype something in most programming languages, you tend to get something from the compiler like "hey what's that you typed in file (Z) at line (X) column ( Y), I have no idea what that is." In C++ you tend to get the equivalent of "AAAAAAaaaaarglgl.... guh." Much of the difficulty consists of learning how to map the gibberish to actual errors. Link to comment https://www.neowin.net/forum/topic/1175399-c-help/#findComment-595932521 Share on other sites More sharing options...
0 FloatingFatMan Posted September 9, 2013 Share Posted September 9, 2013 At least when you mistype something in most programming languages, you tend to get something from the compiler like "hey what's that you typed in file (Z) at line (X) column ( Y), I have no idea what that is." In C++ you tend to get the equivalent of "AAAAAAaaaaarglgl.... guh." Much of the difficulty consists of learning how to map the gibberish to actual errors. Pretty much why I walked away from C/C++ 2 decades ago. :p Sure it's handy, but it's a pain in the backside, too! Link to comment https://www.neowin.net/forum/topic/1175399-c-help/#findComment-595932537 Share on other sites More sharing options...
0 ILikeTobacco Posted September 9, 2013 Share Posted September 9, 2013 WOW just that small mistake and it took me 3 days. jesus. programming is so hard. It isn't hard. Just tedious and annoying lol. It's always the little things that mess you up in programming. Link to comment https://www.neowin.net/forum/topic/1175399-c-help/#findComment-595932541 Share on other sites More sharing options...
0 ILikeTobacco Posted September 9, 2013 Share Posted September 9, 2013 Pretty much why I walked away from C/C++ 2 decades ago. :p Sure it's handy, but it's a pain in the backside, too! Same. Gave up on C++ a long time ago. C# all the way. :P Link to comment https://www.neowin.net/forum/topic/1175399-c-help/#findComment-595932543 Share on other sites More sharing options...
0 Karl L. Posted September 9, 2013 Share Posted September 9, 2013 At least when you mistype something in most programming languages, you tend to get something from the compiler like "hey what's that you typed in file (Z) at line (X) column ( Y), I have no idea what that is." In C++ you tend to get the equivalent of "AAAAAAaaaaarglgl.... guh." Much of the difficulty consists of learning how to map the gibberish to actual errors. That is why I use Clang for my C and C++ work when possible: its error messages are so much more sane than GCC. In my opinion one of the biggest advantages of Visual Studio's C++ compiler over GCC is its error messages. That said, I think that Clang beats them both by a long shot with exceptionally helpful diagnostic messages. I was going to try to demonstrate Clang's superiority in this regard using the author's code, but it didn't actually make that much of a difference. For the record, the results are as follows: $ make CXX=g++ g++ -c -std=c++11 -w -O3 Person.cpp -o Person.o g++ -c -std=c++11 -w -O3 OCCCDate.cpp -o OCCCDate.o g++ -c -std=c++11 -w -O3 TestOCCCDate.cpp -o TestOCCCDate.o In file included from Person.h:7:0, from TestOCCCDate.cpp:4: OCCCDate.h:8:7: error: redefinition of ?class OCCCDate? In file included from TestOCCCDate.cpp:3:0: OCCCDate.h:8:7: error: previous definition of ?class OCCCDate? make: *** [TestOCCCDate.o] Error 1 $ make CXX=clang++ clang++ -c -std=c++11 -w -O3 Person.cpp -o Person.o clang++ -c -std=c++11 -w -O3 OCCCDate.cpp -o OCCCDate.o clang++ -c -std=c++11 -w -O3 TestOCCCDate.cpp -o TestOCCCDate.o In file included from TestOCCCDate.cpp:4: In file included from ./Person.h:7: ./OCCCDate.h:8:7: error: redefinition of 'OCCCDate' class OCCCDate{ ^ ./OCCCDate.h:8:7: note: previous definition is here class OCCCDate{ ^ In file included from TestOCCCDate.cpp:4: In file included from ./Person.h:7: ./OCCCDate.h:15:12: error: expected member name or ';' after declaration specifiers OCCCDate();//default constructor, uses current system date and time ~~~~~~~~ ^ ./OCCCDate.h:16:12: error: expected member name or ';' after declaration specifiers OCCCDate(int day, int month, int year);//as define above ~~~~~~~~ ^ ./OCCCDate.h:16:12: error: expected ')' ./OCCCDate.h:16:11: note: to match this '(' OCCCDate(int day, int month, int year);//as define above ^ 4 errors generated. make: *** [TestOCCCDate.o] Error 1 $ g++ --version g++ (Debian 4.7.2-5) 4.7.2 Copyright (C) 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. $ clang++ --version Debian clang version 3.0-6.2 (tags/RELEASE_30/final) (based on LLVM 3.0) Target: x86_64-pc-linux-gnu Thread model: posix I can understand why Majesticmerc was able to spot the error whereas nether Clang nor GCC could catch it automatically. Therefore I have to agree with you to some extent. While some compilers do a much better job at printing helpful diagnostic messages than others, it is generally much more difficult to pinpoint errors in C++ than in newer languages like Python. I can generally interpret error messages and pinpoint the mistake in my C++ source code pretty quickly, but I think most of that comes down to experience. I remember Googling basically every error message when I started learning C++ hoping to find the resolution posted somewhere on the Internet. So while I would like to disagree with your assessment, I don't think I realistically can. Therefore I would merely like to point out that Clang prints much better diagnostic messages than other compilers - in most cases. Andre S. 1 Share Link to comment https://www.neowin.net/forum/topic/1175399-c-help/#findComment-595933651 Share on other sites More sharing options...
0 fatbeerguy Posted September 12, 2013 Share Posted September 12, 2013 No, C++ is just ****. No decent programming language uses header files and silly macro tricks just to get programs to compile. Don't let your opinion of programming be tainted by the arcane and irrelevant rules of C++, even though it happens that this is what your teacher misleadingly thought would be a good idea to show you first. If your teacher thinks C++ is good just ask him "why are there header files in C++?" and watch him be embarassed. I fondly remember being unable to receive an intelligent answer to this question in my first programming class. It ****es me off to think many people must quit programming simply because they're being shown the most bizarre and capricious language in existence first, and assume that all programming must be like that. It's not. Arm yourself with courage and a good C++ book (I used The C++ Primer Plus by Stephen Prata), and when you're through with this course, take a look at such beautiful languages as Python, C#, F#, Scala, Rust, etc. I guarantee your outlook on programming will change for the better and dramatically so. Seems a bit one sided :). 1. If you don't want "silly macro tricks" aka include guards then just never include the header more than once, or use #pragma once ;) 2. Header files are used to define the interface/contract. If you have a header which contains int get_magic_for_this_machine(); then you call that function, it does some magic, you don't need to know about the 9000 other internal functions and classes it may have/use in its cpp file. Any code in a header file is inlined too. Also its possible to write something that only uses headers... but you'll have to endure huge build times. 3. For his problem there is no way the compiler could help him... #ifdef A #define B // Was this supposed to be A? or is B correct? What about the stuff below? It could mean anything so this could never be statically checked at build time #define C #define D #endif Link to comment https://www.neowin.net/forum/topic/1175399-c-help/#findComment-595941813 Share on other sites More sharing options...
0 Andre S. Veteran Posted September 12, 2013 Veteran Share Posted September 12, 2013 1. If you don't want "silly macro tricks" aka include guards then just never include the header more than once, or use #pragma once Include guards are still the only standard way, and not including the header more than once in any compilation unit is a very difficult problem to solve in general. 2. Header files are used to define the interface/contract. Not true, they also must include private class members, inline and template function definitions, among other implementation details. The way to define interfaces in object-oriented languages is to use actual interfaces. Header files in C++ are just a legacy of the C compilation model; it's not coincidence that no other language makes use of them. 3. For his problem there is no way the compiler could help him... I agree; the reliance of C and C++ on pre-processor tricks are but one of several issues that make the compiler and tooling very difficult to make user-friendly. The compiler can't report anything meaningful about macros because it doesn't know anything of macros. Well-designed languages take the feasability of tooling into consideration, which apparently wasn't on Stroustrup's mind back then. Link to comment https://www.neowin.net/forum/topic/1175399-c-help/#findComment-595942153 Share on other sites More sharing options...
0 fatbeerguy Posted September 15, 2013 Share Posted September 15, 2013 Include guards are still the only standard way, and not including the header more than once in any compilation unit is a very difficult problem to solve in general. Not true, they also must include private class members, inline and template function definitions, among other implementation details. The way to define interfaces in object-oriented languages is to use actual interfaces. Header files in C++ are just a legacy of the C compilation model; it's not coincidence that no other language makes use of them. I agree; the reliance of C and C++ on pre-processor tricks are but one of several issues that make the compiler and tooling very difficult to make user-friendly. The compiler can't report anything meaningful about macros because it doesn't know anything of macros. Well-designed languages take the feasability of tooling into consideration, which apparently wasn't on Stroustrup's mind back then. For interfaces yes you could use something like class IMyInterface { public: virtual ~IMyInterface() { } virtual void the_magic() = 0; }; But if you required data members you wished to be hidden then you can use the PIMPL idiom, but either way someone seeing some basic types or forward declared internal classes in the private section isn't too bad. Link to comment https://www.neowin.net/forum/topic/1175399-c-help/#findComment-595947709 Share on other sites More sharing options...
0 Andre S. Veteran Posted September 15, 2013 Veteran Share Posted September 15, 2013 I know, my point is that header files are not interfaces or contracts, because they expose implementation details. Heck the entire STL is implemented in headers. They're a compiler convenience and a programmer inconvenience. Link to comment https://www.neowin.net/forum/topic/1175399-c-help/#findComment-595947799 Share on other sites More sharing options...
Question
Jay Nguyen
I need to create a DOB out of OCCCDate in the person header file and then call it in the testOCCCDate.cpp. but i dont know how please help me..
here is my UML;
Person
#firstname: String
#lastName:String
DOB :OCCCDate/// i having problem creating this DOB... some1 help me please
OCCCDate.zip
Link to comment
https://www.neowin.net/forum/topic/1175399-c-help/Share on other sites
20 answers to this question
Recommended Posts