Q:

Linked List replaces the front node instead of popping onto back

I'm working on creating a doubly linked list. I seem to be having issues with the pushBack function (supposed to add a node to the end of the list). Somehow it just replaces the first node and points to itself as both the previous and next node. When I go to print the list, it just goes on forever because the next node isn't NULL (because as I said, it's pointing to itself for some reason). Posted below is the entire program. I think I might be having an issue with scope or possible am using the pointers incorrectly.
#include <iostream>

class Node {
public:
  Node();
  Node(int *val, Node *nx = NULL, Node *prev = NULL) {
    value = val; next = nx; previous = prev;
  }

  void setPrev(Node* prev) { previous = prev; }
  void setNext(Node* nx) { next = nx; }
  void setVal(int* x) { value = x; }
  Node* getPrev() { return previous; }
  Node* getNext() { return next; }
  int* getVal() { return value; }

private:
  int* value;
  Node *next;
  Node *previous;
};

class LinkedList {
 public:
  LinkedList() : front(NULL), back(NULL) {}

  bool empty() { return front == NULL; }
  void pushBack(Node *nd) {
    if (back == NULL) {
      front = nd;
      back = nd;
    }
    else {
      back->setNext(nd);
      nd->setPrev(back);
      back = nd;
    }
    std::cout << "Front: " << *front->getVal() << std::endl;
    std::cout << "Back: " << *back->getVal() << std::endl;
  }
  Node* topFront() { return front; }
  void printFront() {
    int *x = front->getVal();
    std::cout << *x << std::endl;
  }

  void print() {
    if (empty()) {
      std::cout << "List is empty" << std::endl;
    }
    else {
      std::cout << "Print list" << std::endl;

      Node *x = front;
      int count = 1;

      // First just print the first element, then the rest
      int *y = front->getVal();
      std::cout << count << ": ";
      std::cout << *y << std::endl;

      x = x->getNext();

      while (x != NULL) {
        std::cout << count << ": ";
        int *z = x->getVal(); std::cout << *z << std::endl;

        x = x->getNext();
      }
    }
  }
 private:
  Node* front;
  Node* back;
};

int main() {
  LinkedList ll;
  char input;
  char const *menu = {"Options:\n\n" \
                      "0. Quit\n" \
                      "1. Print linked-list\n" \
                      "2. pushBack -- add to the end of the LinkedList\n"};

  while (input != '0') {
    std::cout << menu << std::endl;
    std::cout << ":";

    std::cin >> input;

    if (input == '1') {
      ll.print();
    }
    else if (input == '2') {
      std::cout << "Value: ";
      static int init;
      std::cin >> init;
      static Node x(&init);
      ll.pushBack(&x);
    }
  }

  return 0;
}

Below is the input that I used. I printed some values to try to debug the program. You'll notice, I just tried putting the nodes with values 1, 2, 3 and 4 into the list
Options:

0. Quit
1. Print linked-list
2. pushBack -- add to the end of the LinkedList

:2
Value: 1
Front: 1
Back: 1
Node Prev: 0
Node Next: 0
Options:

0. Quit
1. Print linked-list
2. pushBack -- add to the end of the LinkedList

:2
Value: 2
Front: 2
Back: 2
Node Prev: 0x602300
Node Next: 0x602300
Options:

0. Quit
1. Print linked-list
2. pushBack -- add to the end of the LinkedList

:2
Value: 3
Front: 3
Back: 3
Node Prev: 0x602300
Node Next: 0x602300
Options:

0. Quit
1. Print linked-list
2. pushBack -- add to the end of the LinkedList

:2
Value: 4
Front: 4
Back: 4
Node Prev: 0x602300
Node Next: 0x602300
Options:

0. Quit
1. Print linked-list
2. pushBack -- add to the end of the LinkedList

:0

A:

There are lots of good tips here, but none so far will solve the fundamental problem: you need to allocate the Node instances on the heap instead of the stack.
To make this easier, I'm going to suggest you store the ints by value instead of a pointer. Change all the places you use int* to just plain 'int'.
Then change the code to push a node on the back to this:
else if (input == '2') {
  std::cout << "Value: ";
  int init;
  std::cin >> init;
  Node *x = new Node(init);
  ll.pushBack(x);
}

I've tested this with your code and it worked for me.
When you do something like this:
    else if (input == '2') {
  std::cout << "Value: ";
  int init;
  std::cin >> init;
  Node x(init);
  ll.pushBack(&x);
}

You're allocating a Node on the stack, which means as soon as you exit the "else" block the Node 'x' is destroyed and the pointer you added to your list is no longer valid.  You need to allocate Node on the heap with the new operator.  That will keep the Node alive and in memory until you delete it later.
Speaking of delete -- once you get this part working, you'll want to write a destructor that iterates over all the nodes in your list and deletes them.  But for now, I'd focus on getting your other operations correct.

