基本上,我构建了一些代码,其中一个对象数组(我自己创建了对象)需要在类范围内可访问,但在其他一些步骤之后进行初始化。这就是我所做的:
unsigned char stepPin;
unsigned char dirPin;
unsigned char sensorPin;
const char* ident;
//Object
StepperMotor :: StepperMotor(const unsigned char _stepPin,
const unsigned char _dirPin,
const unsigned char _sensorPin,
const char* _ident)
{
stepPin = _stepPin;
dirPin = _dirPin;
sensorPin = _sensorPin;
ident = _ident;
std::cout << "Motor " << ident << ": Step Pin - " << (int)stepPin << " | Direction Pin - " << (int)dirPin << std::endl;
}
#include "stepperMotor.h"
#include <iostream>
#include <wiringPi.h>
#include <thread>
#include <cstdlib>
#include <vector>
#include "stepperManager.h"
StepperMotor motors[] = {
{7, 15, 16, "HS"},
{0, 1, 2, "HL"},
{3, 4, 5, "HP"},
{12, 13, 6, "CS"},
{14, 10, 11, "VP"},
{21, 22, 26, "TC"},
{23, 24, 27, "TR"},
{25, 28, 29, "IN"}
};
StepperManager::StepperManager()
{
for (int i = 0; i < 8; i++){
motors[i].dumpData();
}
}
在初始声明之后,数组中的所有元素都成为最后一个元素。您可以通过查看输出时的输出来看到这一点:
输出:
Motor HS: Step Pin - 7 | Direction Pin - 15
Motor HL: Step Pin - 0 | Direction Pin - 1
Motor HP: Step Pin - 3 | Direction Pin - 4
Motor CS: Step Pin - 12 | Direction Pin - 13
Motor VP: Step Pin - 14 | Direction Pin - 10
Motor TC: Step Pin - 21 | Direction Pin - 22
Motor TR: Step Pin - 23 | Direction Pin - 24
Motor IN: Step Pin - 25 | Direction Pin - 28
Declare the motor man
Motor IN: Step Pin - 25 | Direction Pin - 28
Motor IN: Step Pin - 25 | Direction Pin - 28
Motor IN: Step Pin - 25 | Direction Pin - 28
Motor IN: Step Pin - 25 | Direction Pin - 28
Motor IN: Step Pin - 25 | Direction Pin - 28
Motor IN: Step Pin - 25 | Direction Pin - 28
Motor IN: Step Pin - 25 | Direction Pin - 28
Motor IN: Step Pin - 25 | Direction Pin - 28
所以,我不完全理解为什么会发生这种情况,我已经尝试使数组保持静态,转而使用向量,但没有一个有帮助。我担心自己对语言知之甚少,无法自己找到问题。
有人指出我错过了实际的运行代码。抱歉,那些家伙。
这是&#34;主要&#34;实现对象的文件。
#include <iostream> // For cout and cerr
#include <cstdlib> // For atoi()
#include <cstring>
#include "stepperManager.h"
int main(int argc, char **argv)
{
std::cout << "Declare the motor man" << std::endl;
StepperManager motorMan;
return 0;
}
答案 0 :(得分:1)
在这里,您希望了解有关课程及其工作原理的更多信息。在StepperMotor's
源文件中,您将使用外部链接定义文件范围全局变量。每次构造StepperMotor
时,您都会覆盖相同的变量,因此所有StepperMotors
都有效地访问相同的值(因此您看到的行为)。
由于你有一个C#背景,就像你在这里使用StepperMotors
的静态成员变量一样。您需要非静态成员变量。简单的例子:
foo.h中:
// Foo.h
#ifndef FOO_H
#define FOO_H
class Foo
{
public:
explicit Foo(int value);
void print_value() const;
private:
int member_variable;
}
#endif
Foo.cpp中:
// Foo.cpp
#include "Foo.h"
#include <iostream>
using namespace std;
Foo::Foo(int value): member_variable(value)
{
}
void Foo::print_value() const
{
cout << member_variable << endl;
}
main.cpp中:
// main.cpp
#include "Foo.h"
int main()
{
Foo f1(123);
Foo f2(456);
Foo f3(789);
f1.print_value();
f2.print_value();
f3.print_value();
}
输出:
123
456
789
此外,我在您的示例中看到了一些线程用法。在这一点上,我建议这就像玩杂耍刀片一样。您希望首先坚持基础知识,掌握语言,调试器,然后您可以通过自己的方式实现并行执行,使用分析器进行微调等等。
答案 1 :(得分:0)
您已声明了四个全局变量,每次创建StepperMotor
时都会更改这些变量。相反,您希望这些成为类成员,以便每个对象都有自己的副本,与其他对象无关:
class StepperMotor {
unsigned char stepPin;
unsigned char dirPin;
unsigned char sensorPin;
const char* ident;
// and constructors, member functions, etc.
};
答案 2 :(得分:0)
我认为你的steppermotor.h中应该有这样的东西
class StepperMotor{
//some more stuff
public:
unsigned char stepPin;
unsigned char dirPin;
unsigned char sensorPin;
const char* ident;
unsigned int stepVal;
}
这是在c ++中声明成员变量的方式。 我认为阅读一些c ++教程,学习基础知识可能会很有用。