C++ How to invoke an object's method in a different file

  • Context: C/C++ 
  • Thread starter Thread starter Bob Walance
  • Start date Start date
  • Tags Tags
    C++ programming
Click For Summary

Discussion Overview

The discussion revolves around invoking a method of an object defined in one C++ source file from another source file. Participants explore issues related to object instantiation, linking, and the use of static instances in the context of C++ programming.

Discussion Character

  • Technical explanation
  • Debate/contested

Main Points Raised

  • One participant describes their attempt to invoke the method test_method() of an object myTimerObject from interrupts.cpp, but encounters build errors.
  • Another participant questions the structure of the code, noting that creating an object in one file and using it in another without proper declaration should not compile.
  • Some participants suggest that typically, objects should be passed through pointers to avoid issues with scope and lifetime management.
  • A participant expresses a preference against creating and destroying the instance for each timer interrupt, suggesting it feels messy.
  • Another participant proposes using a static instance if only a single global instance is needed, and questions the naming convention of the class Timers.
  • A later reply confirms that using a static instance resolves the issue and expresses satisfaction with this solution.

Areas of Agreement / Disagreement

There is no consensus on the best approach to manage object instances across files, with some participants advocating for static instances while others emphasize the importance of proper object management through pointers.

Contextual Notes

Participants discuss the implications of object lifetime and scope, as well as the potential confusion arising from naming conventions in the context of C++ programming.

Bob Walance
Insights Author
Gold Member
Messages
84
Reaction score
55
TL;DR
In C++, how to run a method from an object that was created in a separate file.
I have created an object for the class Timers in timer_functions.cpp, and I need to run a method associated with that object ( test_method() ) from interrupts.cpp.

I've tried many things but have been unsuccessful. Any ideas would be appreciated. Here is some sample code:

classes.hpp
C++:
   #pragma once
   class Timers {
   public:
     void test_method(void);
   private:
     int testVariable;
   };

classes.cpp
C++:
#include classes.hpp
   void Timers::test_method(void) {
     testVariable++;
   }

timer_functions.cpp
C++:
#include classes.hpp
   Timers myTimerObject; // create the object
interrupts.cpp
C++:
#include classes.hpp
   extern Timers myTimerObject; // this doesn't eliminate the build error
   void timer_interrupt(void) {
     myTimerObject.test_method(); // trying to run the objects method, but BUILD ERROR
   }
 
Last edited by a moderator:
Technology news on Phys.org
I'm not clear on what you are trying to do, and how things are split up. Normally, if you have a class foo, there is a header foo.hh and the actual code in foo.cc. If I have code bar.cc, it includes foo.hh, and the linker links foo.o and bar.o.

I don't see how your snippets match to this, but you seem to be creating an instance of an object in one file and using it in another. That shouldn't work - it shouldn't even compile, because the object isn't even declared in the second file. (And if it is declared, how does the compiler know it is supposed to be the same as in the first?)

Normally code would create the object and pass it to other code through a pointer to that object. The same code that created it should destroy it when it is no longer needed,
 
Vanadium 50 said:
I'm not clear on what you are trying to do, and how things are split up. Normally, if you have a class foo, there is a header foo.hh and the actual code in foo.cc. If I have code bar.cc, it includes foo.hh, and the linker links foo.o and bar.o.

I don't see how your snippets match to this, but you seem to be creating an instance of an object in one file and using it in another. That shouldn't work - it shouldn't even compile, because the object isn't even declared in the second file. (And if it is declared, how does the compiler know it is supposed to be the same as in the first?)

Normally code would create the object and pass it to other code through a pointer to that object. The same code that created it should destroy it when it is no longer needed,
I don't want to create and destroy the instance for each periodic timer interrupt. While this would probably work, it seems messy.

A pointer to the instance could be created in timer_functions.cpp, but how would it get passed to the timer interrupt?
 
Bob Walance said:
I don't want to create and destroy the instance for each periodic timer interrupt. While this would probably work, it seems messy.

A pointer to the instance could be created in timer_functions.cpp, but how would it get passed to the timer interrupt?
If you intend to have only a single (global) instance of Timers, then you can use a "static" instance. In that case, read up on static class variables and static member fns.

Of course, if you do indeed intend that, then why call it "Timers" (plural) instead of "Timer" singular?
 
  • Like
Likes   Reactions: Vanadium 50 and Bob Walance
strangerep said:
If you intend to have only a single (global) instance of Timers, then you can use a "static" instance. In that case, read up on static class variables and static member fns.
Wow. That works!

Yes, a single instance of the class (really it's no instance) is just fine for my application.

Thank you for the simple solution.
 

Similar threads

  • · Replies 8 ·
Replies
8
Views
2K
  • · Replies 25 ·
Replies
25
Views
3K
Replies
89
Views
6K
  • · Replies 35 ·
2
Replies
35
Views
4K
  • · Replies 13 ·
Replies
13
Views
2K
Replies
5
Views
6K
  • · Replies 6 ·
Replies
6
Views
3K
Replies
2
Views
2K
  • · Replies 2 ·
Replies
2
Views
2K
Replies
3
Views
4K